about summary refs log tree commit diff
path: root/src/libexpr/eval.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-07-28T16·03+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-07-28T16·03+0000
commit4661282fde9f37780877fbeeb34b06b0c221e6bf (patch)
tree234537580ad8a9f51b0738cd990aa35c31247b54 /src/libexpr/eval.cc
parentc11839d7b24993f9639d59f9fa3420e8ccc22e02 (diff)
* `nix-instantiate ... --arg NAME VALUE': allow arguments to be passed
  to functions from the command line.
* nix-build: started removing backticks.

Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r--src/libexpr/eval.cc15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 6c78356db8..834b15cbdf 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -287,20 +287,27 @@ static ATerm concatStrings(EvalState & state, const ATermVector & args)
 }
 
 
-Expr autoCallFunction(Expr e)
+Expr autoCallFunction(Expr e, const ATermMap & args)
 {
     ATermList formals;
     ATerm body, pos;
+    
     if (matchFunction(e, formals, body, pos)) {
+        ATermMap actualArgs(128);
+        
         for (ATermIterator i(formals); i; ++i) {
-            Expr name, def; ATerm values, def2;
+            Expr name, def, value; ATerm values, def2;
             if (!matchFormal(*i, name, values, def2)) abort();
-            if (!matchDefaultValue(def2, def))
+            if ((value = args.get(name)))
+                actualArgs.set(name, makeAttrRHS(value, makeNoPos()));
+            else if (!matchDefaultValue(def2, def))
                 throw TypeError(format("cannot auto-call a function that has an argument without a default value (`%1%')")
                     % aterm2String(name));
         }
-        e = makeCall(e, makeAttrs(ATermMap(0)));
+        
+        e = makeCall(e, makeAttrs(actualArgs));
     }
+    
     return e;
 }