3

这里写在第 1 点:

该文件定义了一组属性,所有这些属性都是具体的派生(即,不是函数)。事实上,我们定义了一组相互递归的属性。也就是说,属性可以相互引用。这正是我们想要的,因为我们想要将各种包“插入”到彼此中。

这似乎有点难以理解。

例如,如果derivation A依赖derivation Bderivation B依赖derivation A,那么在 Nix/NixOS 中如何构建这样一个相互递归的推导对?

您能否举一个简单的例子,如何以及为什么这种相互递归的推导不会导致问题?

4

2 回答 2

6

如果 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-15T12:56:31.113 回答
1

无论如何我都会发布这个,因为它不仅仅是什么,它可能会帮助某人:

在第 1 点:http: //nixos.org/nix/manual/#ex-hello-composition中,写着:“我们定义了一组相互递归的属性”,这有点令人困惑。这不会导致鸡蛋问题吗?

joco42_ 说,包 1 依赖于包 2,但包 2 依赖于包 1,这不是问题吗?

joco42_ 在 nix 中真的可以存在这样的循环依赖吗?

kmicu 不,这不是问题

kmicum 与 Nix http://augustss.blogspot.hu/2011/05/more-points-for-lazy-evaluation-in.html

joco42_ kmicu: 非常感谢

kmicu http://nixos.org/nix/manual/#sec-constructs

joco42_ kmicu: 非常感谢,我刚刚在 sof 上问过这个问题,然后才看到你的评论Nix/NixOS 中的循环依赖关系在一个简单的例子中解释

joco42_ kmicu:所以基本上 nix 表达式是用惰性语言编写的?

kmicu 是的,“Nix 表达式语言是一种纯粹的、惰性的、函数式的语言。”</p>

(在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; }
于 2015-07-12T14:13:37.490 回答