diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-10-25T16·54+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-10-25T16·54+0000 |
commit | 37d7abd69402f0e7a78d4d2f2d78996409a8563a (patch) | |
tree | bf844e4486b0e055921583c4b7c2d3d843b34485 /src/libexpr/nixexpr.cc | |
parent | f4d44a002688262d33093494a7fea1bb11b97ac9 (diff) |
* New language feature: with expressions.
The expression `with E1; E2' evaluates to E2 with all bindings in the attribute set E1 substituted. E.g., with {x = 123;}; x evaluates to 123. That is, the attribute set E1 is in scope in E2. This is particularly useful when importing files containing lots definitions. E.g., instead of let { inherit (import ./foo.nix) a b c d e f; body = ... a ... f ...; } we can now say with import ./foo.nix; ... a ... f ... I.e., we don't have to say what variables should be brought into scope.
Diffstat (limited to 'src/libexpr/nixexpr.cc')
-rw-r--r-- | src/libexpr/nixexpr.cc | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/src/libexpr/nixexpr.cc b/src/libexpr/nixexpr.cc index dec734e46647..78f89db5e5d3 100644 --- a/src/libexpr/nixexpr.cc +++ b/src/libexpr/nixexpr.cc @@ -296,7 +296,7 @@ void checkVarDefs(const ATermMap & defs, Expr e) ATMatcher m; ATerm name; ATermList formals; - ATerm body; + ATerm with, body; ATermList rbnds, nrbnds; if (atMatch(m, e) >> "Var" >> name) { @@ -340,6 +340,13 @@ void checkVarDefs(const ATermMap & defs, Expr e) } checkVarDefs(defs2, (ATerm) rbnds); } + + else if (atMatch(m, e) >> "With" >> with >> body) { + /* We can't check the body without evaluating the definitions + (which is an arbitrary expression), so we don't do that + here but only when actually evaluating the `with'. */ + checkVarDefs(defs, with); + } else if (ATgetType(e) == AT_APPL) { int arity = ATgetArity(ATgetAFun(e)); |