Add a primop ‘elemAt’ to get an element from a list
This commit is contained in:
		
							parent
							
								
									198d0338be
								
							
						
					
					
						commit
						9c2d63084b
					
				
					 1 changed files with 19 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -868,14 +868,27 @@ static void prim_isList(EvalState & state, Value * * args, Value & v)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
static void elemAt(EvalState & state, Value & list, int n, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceList(list);
 | 
			
		||||
    if (n < 0 || n >= list.list.length)
 | 
			
		||||
        throw Error(format("list index %1% is out of bounds") % n);
 | 
			
		||||
    state.forceValue(*list.list.elems[n]);
 | 
			
		||||
    v = *list.list.elems[n];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Return the n-1'th element of a list. */
 | 
			
		||||
static void prim_elemAt(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    elemAt(state, *args[0], state.forceInt(*args[1]), v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Return the first element of a list. */
 | 
			
		||||
static void prim_head(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceList(*args[0]);
 | 
			
		||||
    if (args[0]->list.length == 0)
 | 
			
		||||
        throw Error("`head' called on an empty list");
 | 
			
		||||
    state.forceValue(*args[0]->list.elems[0]);
 | 
			
		||||
    v = *args[0]->list.elems[0];
 | 
			
		||||
    elemAt(state, *args[0], 0, v);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1164,6 +1177,7 @@ void EvalState::createBaseEnv()
 | 
			
		|||
 | 
			
		||||
    // Lists
 | 
			
		||||
    addPrimOp("__isList", 1, prim_isList);
 | 
			
		||||
    addPrimOp("__elemAt", 2, prim_elemAt);
 | 
			
		||||
    addPrimOp("__head", 1, prim_head);
 | 
			
		||||
    addPrimOp("__tail", 1, prim_tail);
 | 
			
		||||
    addPrimOp("map", 2, prim_map);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue