diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-05-16T16·17+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2007-05-16T16·17+0000 |
commit | bddc83a1487e9f3c1bb3ac2279c0238e8e6c3ff3 (patch) | |
tree | 1466672b9f0eb9096cc33af950e964bfdf044f4d /src/libexpr | |
parent | ca00aa11714921804afb490d0613086f549fb894 (diff) |
* New builtin function "isFunction". You're not supposed to use it
;-) * Channels: fix channels that are plain lists of derivations (like strategoxt-unstable) instead of functions (like nixpkgs-unstable). This fixes the error message "error: the left-hand side of the function call is neither a function nor a primop (built-in operation) but a list".
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/eval.cc | 2 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 13 |
2 files changed, 14 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 552b586250b1..a8a22e2f2c78 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -478,7 +478,7 @@ LocalNoInline(Expr evalCall(EvalState & state, Expr fun, Expr arg)) } else throwTypeError( - "the left-hand side of the function call is neither a function nor a primop (built-in operation) but %1%", + "attempt to call something which is neither a function nor a primop (built-in operation) but %1%", showType(fun)); } diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index c7fbca0bb59e..95440c9bf655 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -114,6 +114,18 @@ static Expr prim_isNull(EvalState & state, const ATermVector & args) } +/* Determine whether the argument is a function. */ +static Expr prim_isFunction(EvalState & state, const ATermVector & args) +{ + Expr e = evalExpr(state, args[0]); + ATermList formals; + ATerm name, body, pos; + return makeBool( + matchFunction(e, formals, body, pos) || + matchFunction1(e, name, body, pos)); +} + + static Path findDependency(Path dir, string dep) { if (dep[0] == '/') throw EvalError( @@ -884,6 +896,7 @@ void EvalState::addPrimOps() // Miscellaneous addPrimOp("import", 1, prim_import); addPrimOp("isNull", 1, prim_isNull); + addPrimOp("__isFunction", 1, prim_isFunction); addPrimOp("dependencyClosure", 1, prim_dependencyClosure); addPrimOp("abort", 1, prim_abort); addPrimOp("throw", 1, prim_throw); |