2016-12-17 15 views
3

В Inheriting attributes разделе Никс руководства к, мы имеемНаследование атрибутов из другого набора в Никс Expression Language

graphviz = (import ../tools/graphics/graphviz) { 
    inherit fetchurl stdenv libpng libjpeg expat x11 yacc; 
    inherit (xlibs) libXaw; 
}; 

xlibs = { 
    libX11 = ...; 
    libXaw = ...; 
    ... 
} 

libpng = ...; 
libjpg = ...; 
... 

Что скобки вокруг import ... (т.е. (import ../tools/graphics/graphviz)) делать? Кроме того, что делают скобки в inherit (xlibs) libXaw;?

ответ

4

xlibs в том же объеме, что и graphviz, но libXaw нет, потому что он находится внутри набора xlibs. Поэтому, чтобы иметь возможность передать его в качестве аргумента функции graphviz, вам необходимо явно указать inherit (xlibs) libXaw. Это поведение, обозначенное скобками, уникально для ключевого слова inherit.

Скобки в (import ../tools/graphics/graphviz) являются просто общим соглашением для обозначения порядка оценки. import - это функция, которая принимает один аргумент path. Файл в ../tools/graphics/graphviz содержит единственную функцию, которая принимает в качестве аргумента набор атрибутов. Таким образом, скобки означают, что порядок оценки должен быть (1) импортировать функцию в path, затем (2) применить к этой функции набор атрибутов {...}.


Редактировать: @danbst указал, что в этом случае скобки в import ../tools/graphics/graphviz не нужны. Причиной этого является то, что оценка import ../tools/graphics/graphviz возвращает функцию, которая затем вызывается с помощью набора { ... }.

Необходимость кронштейнов может быть продемонстрирована с использованием тех же значений, что и аргументы для этой функции typesOfArgs = one: two: with builtins; "${typeOf one} and ${typeOf two}", которая возвращает строку. typesOfArgs (import ../tools/graphics/graphviz) { } будет вычисляться "lambda and set", но без скобок интерпретатор будет оценивать typesOfArgs import ../tools/graphics/graphviz к "lambda and path", а затем попытаться вызвать эту строку в виде функции с аргументом { }, который привел бы к error: attempt to call something which is not a function but a string

без скобок интерпретатор будет предположим, что вы хотите вызовите функцию import с двумя аргументами path и { ... }, что будет ошибкой.

+0

Очень хорошее объяснение. Благодаря! – Ben