Циклические зависимости в Nix / NixOS объяснены на простом примере

Здесь в пункте 1 написано:

Этот файл определяет набор атрибутов, все из которых являются конкретными производными (то есть не функциями). Фактически, мы определяем взаимно рекурсивный набор атрибутов. То есть атрибуты могут ссылаться друг на друга. Это именно то, что мы хотим, поскольку мы хотим «подключить» различные пакеты друг к другу.

Это кажется немного трудным для понимания.

Например, если derivation A зависит от derivation B, а derivation B зависит от derivation A, тогда как такая взаимно рекурсивная пара производных построена в Nix / NixOS?

Не могли бы вы привести простой пример, как и почему такие взаимно рекурсивные производные не приводят к проблемам?


person jhegedus    schedule 12.07.2015    source источник


Ответы (2)


Если 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;
}
person lethalman    schedule 15.07.2015

Я все равно опубликую это, потому что это больше, чем ничего, и это может кому-то помочь:

Здесь, в пункте 1: http://nixos.org/nix/manual/#ex-hello-composition, написано: «мы определяем взаимно рекурсивный набор атрибутов», это немного сбивает с толку. Разве это не приводит к проблеме курица-яйцо?

joco42_ Скажем, пакет 1 зависит от пакета 2, но пакет 2 зависит от пакета 1, разве это не проблема?

joco42_ Могут ли такие циклические зависимости действительно существовать в nix?

kmicu Нет, это не проблема

kmicu m с 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 - чистый, ленивый, функциональный язык».

(есть также пример на 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; }
person jhegedus    schedule 12.07.2015