diff options
-rw-r--r-- | src/libexpr/eval.cc | 1 | ||||
-rw-r--r-- | src/libexpr/primops.cc | 7 | ||||
-rw-r--r-- | src/libutil/aterm.cc | 12 | ||||
-rw-r--r-- | src/libutil/aterm.hh | 6 |
4 files changed, 25 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index b110c3a4a41c..f6634e8921a5 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 481966af9e3e..da6927d0fcbd 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 dc6abf9e70e8..fb734b3a0847 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 d38d8e3f4d7a..577b784be202 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); @@ -70,6 +70,10 @@ ATMatcher & operator >> (ATMatcher & pos, string & out); 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); |