在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;
中的括号有什么作用?
答案 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
}
,这将是一个错误。