* Added a builtin function `isList' to test whether a value is a list.

With this primitive, a list-flattening function can be implemented
  (NIX-55, example is in tests/lang/eval-okay-flatten.nix).
This commit is contained in:
Eelco Dolstra 2006-09-22 14:55:19 +00:00
parent c02a44183f
commit d315210612
3 changed files with 29 additions and 0 deletions

View File

@ -521,6 +521,14 @@ static Expr primIsNull(EvalState & state, const ATermVector & args)
}
/* Determine whether the argument is a list. */
static Expr primIsList(EvalState & state, const ATermVector & args)
{
ATermList list;
return makeBool(matchList(evalExpr(state, args[0]), list));
}
static Path findDependency(Path dir, string dep)
{
if (dep[0] == '/') throw EvalError(
@ -782,6 +790,7 @@ void EvalState::addPrimOps()
addPrimOp("__toXML", 1, primToXML);
addPrimOp("__toFile", 1, primToFile);
addPrimOp("isNull", 1, primIsNull);
addPrimOp("__isList", 1, primIsList);
addPrimOp("dependencyClosure", 1, primDependencyClosure);
addPrimOp("abort", 1, primAbort);
addPrimOp("__head", 1, primHead);

View File

@ -0,0 +1 @@
Str("1234567")

View File

@ -0,0 +1,19 @@
let {
fold = op: nul: list:
if list == []
then nul
else op (builtins.head list) (fold op nul (builtins.tail list));
concat =
fold (x: y: x + y) "";
flatten = x:
if builtins.isList x
then fold (x: y: (flatten x) ++ y) [] x
else [x];
l = ["1" "2" ["3" ["4"] ["5" "6"]] "7"];
body = concat (flatten l);
}