aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc1
-rw-r--r--src/libexpr/primops.cc7
-rw-r--r--src/libutil/aterm.cc12
-rw-r--r--src/libutil/aterm.hh6
4 files changed, 25 insertions, 1 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index b110c3a4a..f6634e892 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 481966af9..da6927d0f 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 dc6abf9e7..fb734b3a0 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 d38d8e3f4..577b784be 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);