Overload the ‘+’ operator to support integer addition

This commit is contained in:
Eelco Dolstra 2013-08-02 15:21:17 +00:00
parent 511455965e
commit 159e621d1a
3 changed files with 23 additions and 15 deletions

View File

@ -968,31 +968,39 @@ void ExprConcatStrings::eval(EvalState & state, Env & env, Value & v)
{ {
PathSet context; PathSet context;
std::ostringstream s; std::ostringstream s;
int n = 0;
bool first = true, isPath = false;
Value vStr; bool first = true;
ValueType firstType;
foreach (vector<Expr *>::iterator, i, *es) { foreach (vector<Expr *>::iterator, i, *es) {
(*i)->eval(state, env, vStr); Value vTmp;
(*i)->eval(state, env, vTmp);
/* If the first element is a path, then the result will also /* If the first element is a path, then the result will also
be a path, we don't copy anything (yet - that's done later, be a path, we don't copy anything (yet - that's done later,
since paths are copied when they are used in a derivation), since paths are copied when they are used in a derivation),
and none of the strings are allowed to have contexts. */ and none of the strings are allowed to have contexts. */
if (first) { if (first) {
isPath = !forceString && vStr.type == tPath; firstType = vTmp.type;
first = false; first = false;
} }
s << state.coerceToString(vStr, context, false, !isPath); if (firstType == tInt && !forceString) {
if (vTmp.type != tInt)
throwEvalError("cannot add %1% to an integer", showType(vTmp));
n += vTmp.integer;
} else
s << state.coerceToString(vTmp, context, false, firstType != tPath);
} }
if (isPath && !context.empty())
throwEvalError("a string that refers to a store path cannot be appended to a path, in `%1%'", s.str());
if (isPath) if (firstType == tInt)
mkInt(v, n);
else if (firstType == tPath) {
if (!context.empty())
throwEvalError("a string that refers to a store path cannot be appended to a path, in `%1%'", s.str());
mkPath(v, s.str().c_str()); mkPath(v, s.str().c_str());
else } else
mkString(v, s.str(), context); mkString(v, s.str(), context);
} }

View File

@ -1 +1 @@
1275 1854

View File

@ -8,14 +8,14 @@ let {
else [first] ++ range (builtins.add first 1) last; else [first] ++ range (builtins.add first 1) last;
/* Supposedly tail recursive version: /* Supposedly tail recursive version:
range_ = accum: first: last: range_ = accum: first: last:
if first == last then ([first] ++ accum) if first == last then ([first] ++ accum)
else range_ ([first] ++ accum) (builtins.add first 1) last; else range_ ([first] ++ accum) (builtins.add first 1) last;
range = range_ []; range = range_ [];
*/ */
body = sum (range 1 50); body = sum (range 1 50) + 123 + 456;
} }