diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 6b9350cf87..589faf48ae 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -22,7 +22,7 @@ namespace nix { *************************************************************/ -static Expr primBuiltins(EvalState & state, const ATermVector & args) +static Expr prim_builtins(EvalState & state, const ATermVector & args) { /* Return an attribute set containing all primops. This allows Nix expressions to test for new primops and take appropriate @@ -47,20 +47,20 @@ static Expr primBuiltins(EvalState & state, const ATermVector & args) /* Boolean constructors. */ -static Expr primTrue(EvalState & state, const ATermVector & args) +static Expr prim_true(EvalState & state, const ATermVector & args) { return eTrue; } -static Expr primFalse(EvalState & state, const ATermVector & args) +static Expr prim_false(EvalState & state, const ATermVector & args) { return eFalse; } /* Return the null value. */ -static Expr primNull(EvalState & state, const ATermVector & args) +static Expr prim_null(EvalState & state, const ATermVector & args) { return makeNull(); } @@ -70,13 +70,13 @@ static Expr primNull(EvalState & state, const ATermVector & args) that differs between platforms, so Nix expressions using `__currentSystem' can evaluate to different values on different platforms. */ -static Expr primCurrentSystem(EvalState & state, const ATermVector & args) +static Expr prim_currentSystem(EvalState & state, const ATermVector & args) { return makeStr(thisSystem); } -static Expr primCurrentTime(EvalState & state, const ATermVector & args) +static Expr prim_currentTime(EvalState & state, const ATermVector & args) { return ATmake("Int()", time(0)); } @@ -89,7 +89,7 @@ static Expr primCurrentTime(EvalState & state, const ATermVector & args) /* Load and evaluate an expression from path specified by the argument. */ -static Expr primImport(EvalState & state, const ATermVector & args) +static Expr prim_import(EvalState & state, const ATermVector & args) { PathSet context; Path path = coerceToPath(state, args[0], context); @@ -107,19 +107,8 @@ static Expr primImport(EvalState & state, const ATermVector & args) } -/* Convert the argument to a string. Paths are *not* copied to the - store, so `toString /foo/bar' yields `"/foo/bar"', not - `"/nix/store/whatever..."'. */ -static Expr primToString(EvalState & state, const ATermVector & args) -{ - PathSet context; - string s = coerceToString(state, args[0], context, true, false); - return makeStr(s, context); -} - - /* Determine whether the argument is the null value. */ -static Expr primIsNull(EvalState & state, const ATermVector & args) +static Expr prim_isNull(EvalState & state, const ATermVector & args) { return makeBool(matchNull(evalExpr(state, args[0]))); } @@ -177,7 +166,7 @@ static string relativise(Path pivot, Path p) } -static Expr primDependencyClosure(EvalState & state, const ATermVector & args) +static Expr prim_dependencyClosure(EvalState & state, const ATermVector & args) { startNest(nest, lvlDebug, "finding dependencies"); @@ -272,7 +261,7 @@ static Expr primDependencyClosure(EvalState & state, const ATermVector & args) } -static Expr primAbort(EvalState & state, const ATermVector & args) +static Expr prim_abort(EvalState & state, const ATermVector & args) { PathSet context; throw Abort(format("evaluation aborted with the following error message: `%1%'") % @@ -281,14 +270,14 @@ static Expr primAbort(EvalState & state, const ATermVector & args) /* Return an environment variable. Use with care. */ -static Expr primGetEnv(EvalState & state, const ATermVector & args) +static Expr prim_getEnv(EvalState & state, const ATermVector & args) { string name = evalStringNoCtx(state, args[0]); return makeStr(getEnv(name)); } -static Expr primRelativise(EvalState & state, const ATermVector & args) +static Expr prim_relativise(EvalState & state, const ATermVector & args) { PathSet context; /* !!! what to do? */ Path pivot = coerceToPath(state, args[0], context); @@ -364,7 +353,7 @@ static Hash hashDerivationModulo(EvalState & state, Derivation drv) derivation; `drvPath' containing the path of the Nix expression; and `type' set to `derivation' to indicate that this is a derivation. */ -static Expr primDerivationStrict(EvalState & state, const ATermVector & args) +static Expr prim_derivationStrict(EvalState & state, const ATermVector & args) { startNest(nest, lvlVomit, "evaluating derivation"); @@ -535,7 +524,7 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args) } -static Expr primDerivationLazy(EvalState & state, const ATermVector & args) +static Expr prim_derivationLazy(EvalState & state, const ATermVector & args) { Expr eAttrs = evalExpr(state, args[0]); ATermMap attrs; @@ -561,7 +550,7 @@ static Expr primDerivationLazy(EvalState & state, const ATermVector & args) /* Convert the argument to a path. !!! obsolete? */ -static Expr primToPath(EvalState & state, const ATermVector & args) +static Expr prim_toPath(EvalState & state, const ATermVector & args) { PathSet context; string path = coerceToPath(state, args[0], context); @@ -569,7 +558,7 @@ static Expr primToPath(EvalState & state, const ATermVector & args) } -static Expr primPathExists(EvalState & state, const ATermVector & args) +static Expr prim_pathExists(EvalState & state, const ATermVector & args) { PathSet context; Path path = coerceToPath(state, args[0], context); @@ -581,7 +570,7 @@ static Expr primPathExists(EvalState & state, const ATermVector & args) /* Return the base name of the given string, i.e., everything following the last slash. */ -static Expr primBaseNameOf(EvalState & state, const ATermVector & args) +static Expr prim_baseNameOf(EvalState & state, const ATermVector & args) { PathSet context; return makeStr(baseNameOf(coerceToString(state, args[0], context)), context); @@ -591,7 +580,7 @@ static Expr primBaseNameOf(EvalState & state, const ATermVector & args) /* Return the directory of the given path, i.e., everything before the last slash. Return either a path or a string depending on the type of the argument. */ -static Expr primDirOf(EvalState & state, const ATermVector & args) +static Expr prim_dirOf(EvalState & state, const ATermVector & args) { PathSet context; Expr e = evalExpr(state, args[0]); ATerm dummy; @@ -609,7 +598,7 @@ static Expr primDirOf(EvalState & state, const ATermVector & args) /* Convert the argument (which can be any Nix expression) to an XML representation returned in a string. Not all Nix expressions can be sensibly or completely represented (e.g., functions). */ -static Expr primToXML(EvalState & state, const ATermVector & args) +static Expr prim_toXML(EvalState & state, const ATermVector & args) { std::ostringstream out; PathSet context; @@ -620,7 +609,7 @@ static Expr primToXML(EvalState & state, const ATermVector & args) /* Store a string in the Nix store as a source file that can be used as an input by derivations. */ -static Expr primToFile(EvalState & state, const ATermVector & args) +static Expr prim_toFile(EvalState & state, const ATermVector & args) { PathSet context; string name = evalStringNoCtx(state, args[0]); @@ -677,7 +666,7 @@ struct FilterFromExpr : PathFilter }; -static Expr primFilterSource(EvalState & state, const ATermVector & args) +static Expr prim_filterSource(EvalState & state, const ATermVector & args) { PathSet context; Path path = coerceToPath(state, args[1], context); @@ -701,7 +690,7 @@ static Expr primFilterSource(EvalState & state, const ATermVector & args) /* Return the names of the attributes in an attribute set as a sorted list of strings. */ -static Expr primAttrNames(EvalState & state, const ATermVector & args) +static Expr prim_attrNames(EvalState & state, const ATermVector & args) { ATermMap attrs; queryAllAttrs(evalExpr(state, args[0]), attrs); @@ -720,7 +709,7 @@ static Expr primAttrNames(EvalState & state, const ATermVector & args) /* Dynamic version of the `.' operator. */ -static Expr primGetAttr(EvalState & state, const ATermVector & args) +static Expr prim_getAttr(EvalState & state, const ATermVector & args) { string attr = evalStringNoCtx(state, args[0]); return evalExpr(state, makeSelect(args[1], toATerm(attr))); @@ -728,14 +717,14 @@ static Expr primGetAttr(EvalState & state, const ATermVector & args) /* Dynamic version of the `?' operator. */ -static Expr primHasAttr(EvalState & state, const ATermVector & args) +static Expr prim_hasAttr(EvalState & state, const ATermVector & args) { string attr = evalStringNoCtx(state, args[0]); return evalExpr(state, makeOpHasAttr(args[1], toATerm(attr))); } -static Expr primRemoveAttrs(EvalState & state, const ATermVector & args) +static Expr prim_removeAttrs(EvalState & state, const ATermVector & args) { ATermMap attrs; queryAllAttrs(evalExpr(state, args[0]), attrs, true); @@ -756,7 +745,7 @@ static Expr primRemoveAttrs(EvalState & state, const ATermVector & args) /* Determine whether the argument is a list. */ -static Expr primIsList(EvalState & state, const ATermVector & args) +static Expr prim_isList(EvalState & state, const ATermVector & args) { ATermList list; return makeBool(matchList(evalExpr(state, args[0]), list)); @@ -764,7 +753,7 @@ static Expr primIsList(EvalState & state, const ATermVector & args) /* Return the first element of a list. */ -static Expr primHead(EvalState & state, const ATermVector & args) +static Expr prim_head(EvalState & state, const ATermVector & args) { ATermList list = evalList(state, args[0]); if (ATisEmpty(list)) @@ -775,7 +764,7 @@ static Expr primHead(EvalState & state, const ATermVector & args) /* Return a list consisting of everything but the the first element of a list. */ -static Expr primTail(EvalState & state, const ATermVector & args) +static Expr prim_tail(EvalState & state, const ATermVector & args) { ATermList list = evalList(state, args[0]); if (ATisEmpty(list)) @@ -785,7 +774,7 @@ static Expr primTail(EvalState & state, const ATermVector & args) /* Apply a function to every element of a list. */ -static Expr primMap(EvalState & state, const ATermVector & args) +static Expr prim_map(EvalState & state, const ATermVector & args) { Expr fun = evalExpr(state, args[0]); ATermList list = evalList(state, args[1]); @@ -803,7 +792,7 @@ static Expr primMap(EvalState & state, const ATermVector & args) *************************************************************/ -static Expr primAdd(EvalState & state, const ATermVector & args) +static Expr prim_add(EvalState & state, const ATermVector & args) { int i1 = evalInt(state, args[0]); int i2 = evalInt(state, args[1]); @@ -811,7 +800,7 @@ static Expr primAdd(EvalState & state, const ATermVector & args) } -static Expr primSub(EvalState & state, const ATermVector & args) +static Expr prim_sub(EvalState & state, const ATermVector & args) { int i1 = evalInt(state, args[0]); int i2 = evalInt(state, args[1]); @@ -819,7 +808,7 @@ static Expr primSub(EvalState & state, const ATermVector & args) } -static Expr primLessThan(EvalState & state, const ATermVector & args) +static Expr prim_lessThan(EvalState & state, const ATermVector & args) { int i1 = evalInt(state, args[0]); int i2 = evalInt(state, args[1]); @@ -832,6 +821,17 @@ static Expr primLessThan(EvalState & state, const ATermVector & args) *************************************************************/ +/* Convert the argument to a string. Paths are *not* copied to the + store, so `toString /foo/bar' yields `"/foo/bar"', not + `"/nix/store/whatever..."'. */ +static Expr prim_toString(EvalState & state, const ATermVector & args) +{ + PathSet context; + string s = coerceToString(state, args[0], context, true, false); + return makeStr(s, context); +} + + /* `substr start len str' returns the substring of `str' starting at character position `min(start, stringLength str)' inclusive and ending at `min(start + len, stringLength str)'. `start' must be @@ -857,60 +857,65 @@ static Expr prim_stringLength(EvalState & state, const ATermVector & args) } +/************************************************************* + * Primop registration + *************************************************************/ + + void EvalState::addPrimOps() { - addPrimOp("builtins", 0, primBuiltins); + addPrimOp("builtins", 0, prim_builtins); // Constants - addPrimOp("true", 0, primTrue); - addPrimOp("false", 0, primFalse); - addPrimOp("null", 0, primNull); - addPrimOp("__currentSystem", 0, primCurrentSystem); - addPrimOp("__currentTime", 0, primCurrentTime); + addPrimOp("true", 0, prim_true); + addPrimOp("false", 0, prim_false); + addPrimOp("null", 0, prim_null); + addPrimOp("__currentSystem", 0, prim_currentSystem); + addPrimOp("__currentTime", 0, prim_currentTime); // Miscellaneous - addPrimOp("import", 1, primImport); - addPrimOp("toString", 1, primToString); - addPrimOp("isNull", 1, primIsNull); - addPrimOp("dependencyClosure", 1, primDependencyClosure); - addPrimOp("abort", 1, primAbort); - addPrimOp("__getEnv", 1, primGetEnv); + addPrimOp("import", 1, prim_import); + addPrimOp("isNull", 1, prim_isNull); + addPrimOp("dependencyClosure", 1, prim_dependencyClosure); + addPrimOp("abort", 1, prim_abort); + addPrimOp("__getEnv", 1, prim_getEnv); - addPrimOp("relativise", 2, primRelativise); + addPrimOp("relativise", 2, prim_relativise); // Derivations - addPrimOp("derivation!", 1, primDerivationStrict); - addPrimOp("derivation", 1, primDerivationLazy); + addPrimOp("derivation!", 1, prim_derivationStrict); + addPrimOp("derivation", 1, prim_derivationLazy); // Paths - addPrimOp("__toPath", 1, primToPath); - addPrimOp("__pathExists", 1, primPathExists); - addPrimOp("baseNameOf", 1, primBaseNameOf); - addPrimOp("dirOf", 1, primDirOf); + addPrimOp("__toPath", 1, prim_toPath); + addPrimOp("__pathExists", 1, prim_pathExists); + addPrimOp("baseNameOf", 1, prim_baseNameOf); + addPrimOp("dirOf", 1, prim_dirOf); // Creating files - addPrimOp("__toXML", 1, primToXML); - addPrimOp("__toFile", 2, primToFile); - addPrimOp("__filterSource", 2, primFilterSource); + addPrimOp("__toXML", 1, prim_toXML); + addPrimOp("__toFile", 2, prim_toFile); + addPrimOp("__filterSource", 2, prim_filterSource); // Attribute sets - addPrimOp("__attrNames", 1, primAttrNames); - addPrimOp("__getAttr", 2, primGetAttr); - addPrimOp("__hasAttr", 2, primHasAttr); - addPrimOp("removeAttrs", 2, primRemoveAttrs); + addPrimOp("__attrNames", 1, prim_attrNames); + addPrimOp("__getAttr", 2, prim_getAttr); + addPrimOp("__hasAttr", 2, prim_hasAttr); + addPrimOp("removeAttrs", 2, prim_removeAttrs); // Lists - addPrimOp("__isList", 1, primIsList); - addPrimOp("__head", 1, primHead); - addPrimOp("__tail", 1, primTail); - addPrimOp("map", 2, primMap); + addPrimOp("__isList", 1, prim_isList); + addPrimOp("__head", 1, prim_head); + addPrimOp("__tail", 1, prim_tail); + addPrimOp("map", 2, prim_map); // Integer arithmetic - addPrimOp("__add", 2, primAdd); - addPrimOp("__sub", 2, primSub); - addPrimOp("__lessThan", 2, primLessThan); + addPrimOp("__add", 2, prim_add); + addPrimOp("__sub", 2, prim_sub); + addPrimOp("__lessThan", 2, prim_lessThan); // String manipulation + addPrimOp("toString", 1, prim_toString); addPrimOp("__substring", 3, prim_substring); addPrimOp("__stringLength", 1, prim_stringLength); }