Files
lix/tests/lang
Eelco Dolstra c273c15cb1 Add primop ‘scopedImport’
‘scopedImport’ works like ‘import’, except that it takes a set of
attributes to be added to the lexical scope of the expression,
essentially extending or overriding the builtin variables.  For
instance, the expression

  scopedImport { x = 1; } ./foo.nix

where foo.nix contains ‘x’, will evaluate to 1.

This has a few applications:

* It allows getting rid of function argument specifications in package
  expressions. For instance, a package expression like:

    { stdenv, fetchurl, libfoo }:

    stdenv.mkDerivation { ... buildInputs = [ libfoo ]; }

  can now we written as just

    stdenv.mkDerivation { ... buildInputs = [ libfoo ]; }

  and imported in all-packages.nix as:

    bar = scopedImport pkgs ./bar.nix;

  So whereas we once had dependencies listed in three places
  (buildInputs, the function, and the call site), they now only need
  to appear in one place.

* It allows overriding builtin functions. For instance, to trace all
  calls to ‘map’:

  let
    overrides = {
      map = f: xs: builtins.trace "map called!" (map f xs);

      # Ensure that our override gets propagated by calls to
      # import/scopedImport.
      import = fn: scopedImport overrides fn;

      scopedImport = attrs: fn: scopedImport (overrides // attrs) fn;

      # Also update ‘builtins’.
      builtins = builtins // overrides;
    };
  in scopedImport overrides ./bla.nix

* Similarly, it allows extending the set of builtin functions. For
  instance, during Nixpkgs/NixOS evaluation, the Nixpkgs library
  functions could be added to the default scope.

There is a downside: calls to scopedImport are not memoized, unlike
import. So importing a file multiple times leads to multiple parsings
/ evaluations. It would be possible to construct the AST only once,
but that would require careful handling of variables/environments.
2014-05-26 14:26:29 +02:00
..
2006-03-01 16:26:13 +00:00
2006-05-02 11:20:55 +00:00
2007-01-29 14:23:09 +00:00
2006-10-17 11:16:02 +00:00
2011-07-06 10:58:53 +00:00
2011-07-06 10:58:53 +00:00
2006-03-01 16:26:13 +00:00
2013-12-31 20:59:49 +00:00
2013-12-31 20:59:49 +00:00
2014-02-26 19:08:44 +01:00
2014-02-26 19:08:44 +01:00
2014-02-26 19:08:44 +01:00
2014-02-26 19:08:44 +01:00
2006-03-01 16:26:13 +00:00
2008-02-05 13:25:18 +00:00
2004-10-27 12:41:53 +00:00
2006-03-01 16:26:13 +00:00
2006-05-02 11:15:04 +00:00
2006-05-02 11:20:55 +00:00
2013-11-19 00:04:11 +01:00
2013-11-19 00:04:11 +01:00
2010-05-07 14:46:47 +00:00
2010-05-07 14:46:47 +00:00
2010-05-07 14:46:47 +00:00
2014-02-26 19:08:44 +01:00
2014-02-26 19:08:44 +01:00
2010-03-23 14:51:32 +00:00
2014-05-26 14:26:29 +02:00
2014-05-26 14:26:29 +02:00
2014-02-26 19:08:44 +01:00
2004-10-27 12:41:53 +00:00
2006-08-16 10:29:43 +00:00
2004-10-27 12:41:53 +00:00