2017-09-06 9 views
6

設定な破壊を使用していますニックス関数を呼び出すには、これ以上、とセットそれが必要と正確キーを、それを渡す必要がないと劣ら:Nixの "callPackage"コール関数は、省略記号なしでどのように定義されていますか?

nix-repl> ({ a }: a) { a = 4; b = 5; } 
error: anonymous function at (string):1:2 called with unexpected argument ‘b’, at (string):1:1 

例外これにされた関数の引数の場合は、リストには、末尾に省略記号が含まれています

nix-repl> ({ a, ... }: a) { a = 4; b = 5; } 
4 

しかし、nixpkgsのパッケージのほとんどは、この省略記号で定義されていないある関数を含むdefault.nixファイルで構成されています。しかし、何らかの形でcallPackageを使用すると、これらの関数を呼び出して、必要な引数だけを渡すことができます。これはどのように実装されていますか関数の引数を分解することができ、反射primop、あり

答えて

5

nix-repl> __functionArgs ({ x ? 1, y }: x) 
{ x = true; y = false; } 

callPackageはそれらを反復属性名を、それは後に呼び出される関数にフィードバックされ、必要なパッケージを取得し、パッケージのattrsetをconstucts。ここで

は簡単な例です:

nix-repl> callWithExtraArgs = f: args: 
      let 
       args' = __intersectAttrs (__functionArgs f) args; 
      in 
       f args' 

nix-repl> callWithExtraArgs ({ x }: x + 1) { x = 4; y = 7; } 
5 
関連する問題