2017-09-06 32 views
6

seti strüktür kullanan bir Nix işlevini çağırmak için, tam bu fazla gerektirir anahtarları ile bunu bir dizi geçmesi gerekiyor ve az:Nix'in "callPackage" çağırma işlevleri elips olmaksızın nasıl tanımlanır?

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

Bunun istisnası olan işlevin argümanı eğer

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

Ancak nixpkgs paketlerin çoğu bu nokta ile tanımlanan olmayan bir fonksiyon ihtiva eden bir default.nix dosya oluşur: liste ucunda bir üç nokta vardır. Yine de, bir şekilde callPackage'u kullandığınızda, bu işlevleri çağırmayı ve yalnızca ihtiyaç duydukları argümanları iletmeyi başarıyor. Bu nasıl uygulanır?

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

callPackage sonra bu üzerinde dolaşır özellik adlarını

, gerekli paketleri getirir ve paketlerin attrset constucts o denilen işleve daha sonra beslenir,:

cevap

5

fonksiyon argüman deconstruct bir yansıması primop vardır.

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 
: Burada

basit bir örnek
İlgili konular