Overload the ‘+’ operator to support integer addition
This commit is contained in:
		
							parent
							
								
									511455965e
								
							
						
					
					
						commit
						159e621d1a
					
				
					 3 changed files with 23 additions and 15 deletions
				
			
		|  | @ -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); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1 +1 @@ | ||||||
| 1275 | 1854 | ||||||
|  |  | ||||||
|  | @ -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; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue