From 2ab4bc44c780d2e28647f7559664675b756f38b9 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Fri, 22 Sep 2006 15:29:21 +0000 Subject: * Builtin function `add' to add integers. * Put common test functions in tests/lang/lib.nix. --- src/libexpr/eval.cc | 10 ++++++++++ src/libexpr/eval.hh | 1 + src/libexpr/primops.cc | 9 +++++++++ 3 files changed, 20 insertions(+) (limited to 'src') diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 02df4a4a325a..3334e4bbded8 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -176,6 +176,16 @@ Path evalPath(EvalState & state, Expr e) } +int evalInt(EvalState & state, Expr e) +{ + e = evalExpr(state, e); + int i; + if (!matchInt(e, i)) + throw TypeError(format("value is %1% while an integer was expected") % showType(e)); + return i; +} + + bool evalBool(EvalState & state, Expr e) { e = evalExpr(state, e); diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh index b34e91055a37..a7f4e69437be 100644 --- a/src/libexpr/eval.hh +++ b/src/libexpr/eval.hh @@ -62,6 +62,7 @@ Expr strictEvalExpr(EvalState & state, Expr e, /* Specific results. */ string evalString(EvalState & state, Expr e); Path evalPath(EvalState & state, Expr e); +int evalInt(EvalState & state, Expr e); bool evalBool(EvalState & state, Expr e); ATermList evalList(EvalState & state, Expr e); ATerm coerceToString(Expr e); diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 190d587330d1..1739b6656d45 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -771,6 +771,14 @@ static Expr primRelativise(EvalState & state, const ATermVector & args) } +static Expr primAdd(EvalState & state, const ATermVector & args) +{ + int i1 = evalInt(state, args[0]); + int i2 = evalInt(state, args[1]); + return makeInt(i1 + i2); +} + + void EvalState::addPrimOps() { addPrimOp("builtins", 0, primBuiltins); @@ -801,6 +809,7 @@ void EvalState::addPrimOps() addPrimOp("__hasAttr", 2, primHasAttr); addPrimOp("removeAttrs", 2, primRemoveAttrs); addPrimOp("relativise", 2, primRelativise); + addPrimOp("__add", 2, primAdd); } -- cgit 1.4.1