这里它写在第1点:
该文件定义了一组属性,所有这些属性都是具体的派生(即,不是函数)。实际上,我们定义了一个相互递归的属性集,,即属性可以相互引用。这正是我们想要的,因为我们希望将不同的包“插入”到彼此之间。
这似乎有点难以理解。
例如,如果derivation A依赖于derivation B,而derivation B依赖于derivation A,那么在Nix/NixOS中构建的这种相互递归的派生子是如何实现的呢?
请给出一个简单的例子,,为什么这种相互递归的派生不会导致问题?
发布于 2015-07-15 12:56:31
如果A依赖于B,反之亦然,则它是循环依赖关系,Nix无法处理这一点。
但相互递归集是另一回事。它只意味着A可以依赖同一组的B:
rec {
a = 1;
b = 2;
c = a+b;
}正如jhegedus所说,它相当于(因为懒惰):
let s = with s; {
a = 1;
b = 2;
c = a+b;
};
in s但这是一个循环,不起作用:
rec {
a = b;
b = a;
}发布于 2015-07-12 14:13:37
无论如何,我都会发这篇文章,因为它不仅仅是什么都没有,它可能会对某人有所帮助:
在第1点:http://nixos.org/nix/manual/#ex-hello-composition中,它被写成:“我们定义了一个相互递归的属性集”,这有点让人困惑。这不会导致鸡蛋问题吗?
joco42_说,包1依赖于包2,而包2依赖于包1,这不是一个问题吗?
joco42_这种循环依赖真的存在于nix中吗?
克米库,不,这不是个问题
带Nix http://augustss.blogspot.hu/2011/05/more-points-for-lazy-evaluation-in.html的kmicu m
joco42_ kmicu:非常感谢
kmicu http://nixos.org/nix/manual/#sec-constructs
joco42_ kmicu:非常感谢,在我看到您的评论在一个简单的例子中解释了Nix/NixOS中的循环依赖关系之前,我刚刚在sof上问过这个问题
joco42_ kmicu:那么基本上nix表达式是用一种懒惰的语言编写的吗?
kmicu是的,“Nix表达式语言是一种纯粹的、懒惰的、功能性的语言。
(在http://lethalman.blogspot.com/2014/11/nix-pill-17-nixpkgs-overriding-packages.html也有一个例子)
基本上是,nix语言可以处理递归,因为它很懒:
nix-repl> fix=f : let r= f r ; in r
nix-repl> p= s: { a=3;b=4; c=s.a+s.b;}
nix-repl> fix p
{ a = 3; b = 4; c = 7; }https://stackoverflow.com/questions/31368647
复制相似问题