From 6e8c19714af00b8340eea6eecf1c38fc6b09f6de Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 25 Nov 2003 12:05:48 +0000 Subject: [PATCH] * Allow integer bindings in derivations. --- src/libexpr/eval.cc | 1 + src/libexpr/primops.cc | 7 +++++++ src/libutil/aterm.cc | 12 ++++++++++++ src/libutil/aterm.hh | 6 +++++- 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index b110c3a4a4..f6634e8921 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -127,6 +127,7 @@ Expr evalExpr2(EvalState & state, Expr e) if (atMatch(m, e) >> "Str" || atMatch(m, e) >> "Path" || atMatch(m, e) >> "Uri" || + atMatch(m, e) >> "Int" || atMatch(m, e) >> "Bool" || atMatch(m, e) >> "Function" || atMatch(m, e) >> "Attrs" || diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 481966af9e..da6927d0fc 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -89,6 +89,13 @@ static string processBinding(EvalState & state, Expr e, StoreExpr & ne) if (atMatch(m, e) >> "Bool" >> "True") return "1"; if (atMatch(m, e) >> "Bool" >> "False") return ""; + int n; + if (atMatch(m, e) >> "Int" >> n) { + ostringstream st; + st << n; + return st.str(); + } + if (atMatch(m, e) >> "Attrs" >> es) { Expr a = queryAttr(e, "type"); if (a && evalString(state, a) == "derivation") { diff --git a/src/libutil/aterm.cc b/src/libutil/aterm.cc index dc6abf9e70..fb734b3a08 100644 --- a/src/libutil/aterm.cc +++ b/src/libutil/aterm.cc @@ -81,6 +81,18 @@ ATMatcher & operator >> (ATMatcher & pos, const string & s) } +ATMatcher & operator >> (ATMatcher & pos, int & n) +{ + n = 0; + ATerm t; + pos = pos >> t; + if (failed(pos)) return pos; + if (ATgetType(t) != AT_INT) return fail(pos); + n = ATgetInt((ATermInt) t); + return pos; +} + + ATMatcher & operator >> (ATMatcher & pos, ATermList & out) { out = 0; diff --git a/src/libutil/aterm.hh b/src/libutil/aterm.hh index d38d8e3f4d..577b784be2 100644 --- a/src/libutil/aterm.hh +++ b/src/libutil/aterm.hh @@ -61,7 +61,7 @@ ATMatcher & atMatch(ATMatcher & pos, ATerm t); /* Get the next argument of an application. */ ATMatcher & operator >> (ATMatcher & pos, ATerm & out); -/* Get the name of the function symbol of an applicatin, or the next +/* Get the name of the function symbol of an application, or the next argument of an application as a string. */ ATMatcher & operator >> (ATMatcher & pos, string & out); @@ -69,6 +69,10 @@ ATMatcher & operator >> (ATMatcher & pos, string & out); string. */ ATMatcher & operator >> (ATMatcher & pos, const string & s); +/* Get the next argument of an application, and verify that it is a + integer. */ +ATMatcher & operator >> (ATMatcher & pos, int & n); + /* Get the next argument of an application, and verify that it is a list. */ ATMatcher & operator >> (ATMatcher & pos, ATermList & out);