diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-08-05T11·13+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-08-05T11·13+0000 |
commit | 17f05dba775bb95858d9ac60ab9a9abcbe88b2fc (patch) | |
tree | 29fb9ccef778d5748e7d9654d10077c4199caf3f /src/fix.cc | |
parent | d6b6b2d3a83aa2afe3cae361954d8aa640fd77da (diff) |
* Allow the top-level expression to be a list of expressions that
normalise to Nix expression.
Diffstat (limited to 'src/fix.cc')
-rw-r--r-- | src/fix.cc | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/fix.cc b/src/fix.cc index 4235165ccdd4..57cb12630901 100644 --- a/src/fix.cc +++ b/src/fix.cc @@ -130,6 +130,7 @@ static Expr evalExpr2(EvalState & state, Expr e) /* Normal forms. */ if (ATmatch(e, "<str>", &s1) || + ATmatch(e, "[<list>]", &e1) || ATmatch(e, "Function([<list>], <term>)", &e1, &e2) || ATmatch(e, "FSId(<str>)", &s1)) return e; @@ -299,6 +300,23 @@ static Expr evalFile(EvalState & state, string relPath) } +static void printFSId(EvalState & state, Expr e) +{ + ATermList es; + char * s; + if (ATmatch(e, "FSId(<str>)", &s)) { + cout << format("%1%\n") % s; + } + else if (ATmatch(e, "[<list>]", &es)) { + while (!ATisEmpty(es)) { + printFSId(state, evalExpr(state, ATgetFirst(es))); + es = ATgetNext(es); + } + } + else throw badTerm("top level does not evaluate to a (list of) Nix expression(s)", e); +} + + void run(Strings args) { openDB(); @@ -333,11 +351,7 @@ void run(Strings args) it != files.end(); it++) { Expr e = evalFile(state, *it); - char * s; - if (ATmatch(e, "FSId(<str>)", &s)) { - cout << format("%1%\n") % s; - } - else throw badTerm("top level is not a package", e); + printFSId(state, e); } } |