在Nix表达式语言中继承另一个集合的属性

时间:2016-12-17 04:14:54

标签: nix nixos

在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;中的括号有什么作用?

1 个答案:

答案 0 :(得分:6)

xlibs与graphviz属于同一范围,但libXaw不属于xlibs,因为它位于inherit (xlibs) libXaw集内。因此,为了能够将其作为参数传递给graphviz函数,您需要明确inherit。括号表示的行为对(import ../tools/graphics/graphviz)关键字是唯一的。

import中的括号只是表示评估顺序的通用惯例。 path是一个接受单个参数../tools/graphics/graphviz的函数。 path中的文件包含一个函数,该函数接受一组属性作为其参数。所以括号表示评估的顺序应该是(1)在{...}中导入函数,然后(2)将属性集import ../tools/graphics/graphviz应用于该函数。

<小时/> 编辑:@danbst指出,在这种情况下,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{ ... }调用函数string sERH = "Error Recovery Histogram:"; //MAKE SURE YOU PUT THE : IN THERE! int erhPos = fLine.IndexOf(sERH); string[] valsERH = new string[16]; //WHY 16?? char spliter = ' '; //YOU ONLY NEED THE CHAR MARKER FOR YOUR SPLITTER string[] subStrings = sERH.Split(spliter); //CREATE YOUR SUBSTRINGS int[] iNumbers = new int[subStrings.Count()]; //CREATE YOUR ARRAY OF INT'S for (int i = 0; i < subStrings.Count(); i ++) { try { iNumbers[i] = Convert.ToInt32(subStrings[i]); //IF YOU CAN CONVERT IT TO AN INT } catch { } //OR LEAVE IT AS A STRING } ,这将是一个错误。