8

Nix マニュアルのInheriting attributesセクションでは、

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

1 に答える 1

8

xlibsGraphviz と同じスコープにありますがlibXaw、セット内にあるため、そうではありませんxlibs。したがって、graphviz 関数に引数として渡すことができるようにするには、明示的にする必要がありますinherit (xlibs) libXawinherit括弧で示される動作は、キーワードに固有のものです。

の括弧は(import ../tools/graphics/graphviz)、評価の順序を示すための一般的な規則です。import単一の引数を受け入れる関数ですpath。のファイルに../tools/graphics/graphvizは、一連の属性を引数として受け入れる関数が 1 つ含まれています。したがって、括弧は、評価の順序が (1) 関数をインポートしてからpath、(2) その関数に設定された属性を適用する必要が{...}あることを示しています。


編集: @danbst は、この場合、角かっこは必要ないことを指摘しましたimport ../tools/graphics/graphviz。これは、 evaluateimport ../tools/graphics/graphvizが set で呼び出される関数を返すためです{ ... }

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とを指定して関数を呼び出したいと想定し{ ... }、エラーになります。

于 2016-12-20T17:48:47.287 に答える