* Added a builtin function `isList' to test whether a value is a list.
With this primitive, a list-flattening function can be implemented (NIX-55, example is in tests/lang/eval-okay-flatten.nix).
This commit is contained in:
		
							parent
							
								
									c02a44183f
								
							
						
					
					
						commit
						d315210612
					
				
					 3 changed files with 29 additions and 0 deletions
				
			
		|  | @ -521,6 +521,14 @@ static Expr primIsNull(EvalState & state, const ATermVector & args) | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| /* Determine whether the argument is a list. */ | ||||
| static Expr primIsList(EvalState & state, const ATermVector & args) | ||||
| { | ||||
|     ATermList list; | ||||
|     return makeBool(matchList(evalExpr(state, args[0]), list)); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| static Path findDependency(Path dir, string dep) | ||||
| { | ||||
|     if (dep[0] == '/') throw EvalError( | ||||
|  | @ -782,6 +790,7 @@ void EvalState::addPrimOps() | |||
|     addPrimOp("__toXML", 1, primToXML); | ||||
|     addPrimOp("__toFile", 1, primToFile); | ||||
|     addPrimOp("isNull", 1, primIsNull); | ||||
|     addPrimOp("__isList", 1, primIsList); | ||||
|     addPrimOp("dependencyClosure", 1, primDependencyClosure); | ||||
|     addPrimOp("abort", 1, primAbort); | ||||
|     addPrimOp("__head", 1, primHead); | ||||
|  |  | |||
							
								
								
									
										1
									
								
								tests/lang/eval-okay-flatten.exp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								tests/lang/eval-okay-flatten.exp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1 @@ | |||
| Str("1234567") | ||||
							
								
								
									
										19
									
								
								tests/lang/eval-okay-flatten.nix
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tests/lang/eval-okay-flatten.nix
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| 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"]; | ||||
| 
 | ||||
|   body = concat (flatten l); | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue