在Nix手册的继承属性部分,我们有
graphviz = (import ../tools/graphics/graphviz) {
inherit fetchurl stdenv libpng libjpeg expat x11 yacc;
inherit (xlibs) libXaw;
};
xlibs = {
libX11 = ...;
libXaw = ...;
...
}
libpng = ...;
libjpg = ...;
...
Run Code Online (Sandbox Code Playgroud)
括号import ...(ie (import ../tools/graphics/graphviz))的作用是什么?另外,括号中有inherit (xlibs) libXaw;什么作用?
xlibs与graphviz处于相同的范围但libXaw不是,因为它在xlibs集合中.因此,为了能够将它作为参数传递给graphviz函数,您需要明确地将其传递给它inherit (xlibs) libXaw.括号表示的行为对于inherit关键字是唯一的.
括号中(import ../tools/graphics/graphviz)只是表示评价顺序的通用惯例.import是一个接受单个参数的函数path.该文件../tools/graphics/graphviz包含一个函数,该函数接受一组属性作为其参数.所以括号表示评估的顺序应该是(1)导入函数path然后(2)将属性集{...}应用于该函数.
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与2个参数path和{ ... },这将是一个错误.