* Builtin function `add' to add integers.
* Put common test functions in tests/lang/lib.nix.
This commit is contained in:
		
							parent
							
								
									d315210612
								
							
						
					
					
						commit
						2ab4bc44c7
					
				
					 11 changed files with 68 additions and 26 deletions
				
			
		|  | @ -176,6 +176,16 @@ Path evalPath(EvalState & state, Expr e) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | int evalInt(EvalState & state, Expr e) | ||||||
|  | { | ||||||
|  |     e = evalExpr(state, e); | ||||||
|  |     int i; | ||||||
|  |     if (!matchInt(e, i)) | ||||||
|  |         throw TypeError(format("value is %1% while an integer was expected") % showType(e)); | ||||||
|  |     return i; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| bool evalBool(EvalState & state, Expr e) | bool evalBool(EvalState & state, Expr e) | ||||||
| { | { | ||||||
|     e = evalExpr(state, e); |     e = evalExpr(state, e); | ||||||
|  |  | ||||||
|  | @ -62,6 +62,7 @@ Expr strictEvalExpr(EvalState & state, Expr e, | ||||||
| /* Specific results. */ | /* Specific results. */ | ||||||
| string evalString(EvalState & state, Expr e); | string evalString(EvalState & state, Expr e); | ||||||
| Path evalPath(EvalState & state, Expr e); | Path evalPath(EvalState & state, Expr e); | ||||||
|  | int evalInt(EvalState & state, Expr e); | ||||||
| bool evalBool(EvalState & state, Expr e); | bool evalBool(EvalState & state, Expr e); | ||||||
| ATermList evalList(EvalState & state, Expr e); | ATermList evalList(EvalState & state, Expr e); | ||||||
| ATerm coerceToString(Expr e); | ATerm coerceToString(Expr e); | ||||||
|  |  | ||||||
|  | @ -771,6 +771,14 @@ static Expr primRelativise(EvalState & state, const ATermVector & args) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | static Expr primAdd(EvalState & state, const ATermVector & args) | ||||||
|  | { | ||||||
|  |     int i1 = evalInt(state, args[0]); | ||||||
|  |     int i2 = evalInt(state, args[1]); | ||||||
|  |     return makeInt(i1 + i2); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| void EvalState::addPrimOps() | void EvalState::addPrimOps() | ||||||
| { | { | ||||||
|     addPrimOp("builtins", 0, primBuiltins); |     addPrimOp("builtins", 0, primBuiltins); | ||||||
|  | @ -801,6 +809,7 @@ void EvalState::addPrimOps() | ||||||
|     addPrimOp("__hasAttr", 2, primHasAttr); |     addPrimOp("__hasAttr", 2, primHasAttr); | ||||||
|     addPrimOp("removeAttrs", 2, primRemoveAttrs); |     addPrimOp("removeAttrs", 2, primRemoveAttrs); | ||||||
|     addPrimOp("relativise", 2, primRelativise); |     addPrimOp("relativise", 2, primRelativise); | ||||||
|  |     addPrimOp("__add", 2, primAdd); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|   |   | ||||||
|  |  | ||||||
|  | @ -27,7 +27,7 @@ done | ||||||
| for i in lang/eval-fail-*.nix; do | for i in lang/eval-fail-*.nix; do | ||||||
|     echo "evaluating $i (should fail)"; |     echo "evaluating $i (should fail)"; | ||||||
|     i=$(basename $i .nix) |     i=$(basename $i .nix) | ||||||
|     if $nixinstantiate --eval-only - < lang/$i.nix; then |     if $nixinstantiate --eval-only lang/$i.nix; then | ||||||
|         echo "FAIL: $i shouldn't evaluate" |         echo "FAIL: $i shouldn't evaluate" | ||||||
|         fail=1 |         fail=1 | ||||||
|     fi |     fi | ||||||
|  | @ -38,7 +38,7 @@ for i in lang/eval-okay-*.nix; do | ||||||
|     i=$(basename $i .nix) |     i=$(basename $i .nix) | ||||||
| 
 | 
 | ||||||
|     if test -e lang/$i.exp; then |     if test -e lang/$i.exp; then | ||||||
|         if ! $nixinstantiate --eval-only - < lang/$i.nix > lang/$i.out; then |         if ! $nixinstantiate --eval-only lang/$i.nix > lang/$i.out; then | ||||||
|             echo "FAIL: $i should evaluate" |             echo "FAIL: $i should evaluate" | ||||||
|             fail=1 |             fail=1 | ||||||
|         fi |         fi | ||||||
|  | @ -49,7 +49,7 @@ for i in lang/eval-okay-*.nix; do | ||||||
|     fi |     fi | ||||||
|      |      | ||||||
|     if test -e lang/$i.exp.xml; then |     if test -e lang/$i.exp.xml; then | ||||||
|         if ! $nixinstantiate --eval-only --xml --strict - < lang/$i.nix > lang/$i.out.xml; then |         if ! $nixinstantiate --eval-only --xml --strict lang/$i.nix > lang/$i.out.xml; then | ||||||
|             echo "FAIL: $i should evaluate" |             echo "FAIL: $i should evaluate" | ||||||
|             fail=1 |             fail=1 | ||||||
|         fi |         fi | ||||||
|  |  | ||||||
							
								
								
									
										1
									
								
								tests/lang/eval-okay-arithmetic.exp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/lang/eval-okay-arithmetic.exp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | Int(1275) | ||||||
							
								
								
									
										18
									
								
								tests/lang/eval-okay-arithmetic.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tests/lang/eval-okay-arithmetic.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | with import ./lib.nix; | ||||||
|  | 
 | ||||||
|  | let { | ||||||
|  | 
 | ||||||
|  |   range = first: last: [first] ++ (if first == last then [] else range (builtins.add first 1) last); | ||||||
|  | 
 | ||||||
|  |   /* Supposedly tail recursive version: | ||||||
|  |    | ||||||
|  |   range_ = accum: first: last:  | ||||||
|  |     if first == last then ([first] ++ accum) | ||||||
|  |     else range_ ([first] ++ accum) (builtins.add first 1) last; | ||||||
|  | 
 | ||||||
|  |   range = range_ []; | ||||||
|  |   */ | ||||||
|  | 
 | ||||||
|  |   body = sum (range 1 50); | ||||||
|  | 
 | ||||||
|  | } | ||||||
|  | @ -1,18 +1,7 @@ | ||||||
|  | with import ./lib.nix; | ||||||
|  | 
 | ||||||
| let { | let { | ||||||
| 
 | 
 | ||||||
|   fold = op: nul: list: |  | ||||||
|     if list == [] |  | ||||||
|     then nul |  | ||||||
|     else op (builtins.head list) (fold op nul (builtins.tail list)); |  | ||||||
| 
 |  | ||||||
|   concat = |  | ||||||
|     fold (x: y: x + y) ""; |  | ||||||
|      |  | ||||||
|   flatten = x: |  | ||||||
|     if builtins.isList x |  | ||||||
|     then fold (x: y: (flatten x) ++ y) [] x |  | ||||||
|     else [x]; |  | ||||||
| 
 |  | ||||||
|   l = ["1" "2" ["3" ["4"] ["5" "6"]] "7"]; |   l = ["1" "2" ["3" ["4"] ["5" "6"]] "7"]; | ||||||
| 
 | 
 | ||||||
|   body = concat (flatten l); |   body = concat (flatten l); | ||||||
|  |  | ||||||
|  | @ -1,13 +1,7 @@ | ||||||
|  | with import ./lib.nix; | ||||||
|  | 
 | ||||||
| let { | let { | ||||||
| 
 | 
 | ||||||
|   fold = op: nul: list: |  | ||||||
|     if list == [] |  | ||||||
|     then nul |  | ||||||
|     else op (builtins.head list) (fold op nul (builtins.tail list)); |  | ||||||
| 
 |  | ||||||
|   concat = |  | ||||||
|     fold (x: y: x + y) ""; |  | ||||||
| 
 |  | ||||||
|   body = concat ["foo" "bar" "bla" "test"]; |   body = concat ["foo" "bar" "bla" "test"]; | ||||||
|      |      | ||||||
| } | } | ||||||
|  | @ -1 +1 @@ | ||||||
| List([Call(Function1("x",OpPlus(Var("x"),Str("bar")),Pos("(string)",1,7)),Str("foo")),Call(Function1("x",OpPlus(Var("x"),Str("bar")),Pos("(string)",1,7)),Str("bla")),Call(Function1("x",OpPlus(Var("x"),Str("bar")),Pos("(string)",1,7)),Str("xyzzy"))]) | Str("foobarblabarxyzzybar") | ||||||
|  |  | ||||||
|  | @ -1 +1,3 @@ | ||||||
| map (x: x + "bar") [ "foo" "bla" "xyzzy" ] | with import ./lib.nix; | ||||||
|  | 
 | ||||||
|  | concat (map (x: x + "bar") [ "foo" "bla" "xyzzy" ]) | ||||||
							
								
								
									
										18
									
								
								tests/lang/lib.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								tests/lang/lib.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | rec { | ||||||
|  | 
 | ||||||
|  |   fold = op: nul: list: | ||||||
|  |     if list == [] | ||||||
|  |     then nul | ||||||
|  |     else op (builtins.head list) (fold op nul (builtins.tail list)); | ||||||
|  | 
 | ||||||
|  |   concat = | ||||||
|  |     fold (x: y: x + y) ""; | ||||||
|  | 
 | ||||||
|  |   flatten = x: | ||||||
|  |     if builtins.isList x | ||||||
|  |     then fold (x: y: (flatten x) ++ y) [] x | ||||||
|  |     else [x]; | ||||||
|  | 
 | ||||||
|  |   sum = fold (x: y: builtins.add x y) 0; | ||||||
|  | 
 | ||||||
|  | } | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue