在Nix手册的 Inheriting attributes部分,我们有 graphviz = (import ../tools/graphics/graphviz) { inherit fetchurl stdenv libpng libjpeg expat x11 yacc; inherit (xlibs) libXaw;};xlibs = { libX11 = ...; libXaw = ...; ...}libpng = ...;li
graphviz = (import ../tools/graphics/graphviz) { inherit fetchurl stdenv libpng libjpeg expat x11 yacc; inherit (xlibs) libXaw; }; xlibs = { libX11 = ...; libXaw = ...; ... } libpng = ...; libjpg = ...; ...
导入的括号是什么…(即(import ../tools/graphics/graphviz))吗?另外,继承中的括号是什么(xlibs)libXaw;做?
xlibs与graphviz在同一范围内,但libXaw不在,因为它位于xlibs集内.因此,为了能够将它作为参数传递给graphviz函数,您需要显式继承(xlibs)libXaw.括号表示的行为对inherit关键字是唯一的.(import ../tools/graphics/graphviz)中的括号只是表示评估顺序的通用惯例. import是一个接受单个参数路径的函数. ../tools/graphics/graphviz中的文件包含一个函数,该函数接受一组属性作为其参数.所以括号表示评估的顺序应该是(1)在路径中导入函数然后(2)将属性集{…}应用于该函数.
编辑:@danbst指出,在这种情况下,不需要导入../tools/graphics/graphviz中的括号.这样做的原因是评估import ../tools/graphics/graphviz会返回一个函数,然后使用集合{…}调用该函数.
括号的必要性可以通过使用与此函数的参数相同的值来证明:typeOfArgs = one:two:with builtins; “${typeOf one}和${typeOf two}”返回一个字符串. typesOfArgs(import ../tools/graphics/graphviz){}将评估为“lambda and set”但没有括号,解释器会将typesOfArgs导入../tools/graphics/graphviz评估为“lambda and path”然后尝试将该字符串称为带有参数{}的函数,这将导致错误:尝试调用不是函数而是字符串的东西
如果没有括号,解释器会假设您想要使用2参数路径和{…}调用函数import,这将是一个错误.