Add a typeOf primop
We already have some primops for determining the type of a value, such as isString, but they're incomplete: for instance, there is no isPath. Rather than adding more isBla functions, the generic typeOf function returns a string representing the type of the argument (e.g. "int").
This commit is contained in:
		
							parent
							
								
									6da92d96ae
								
							
						
					
					
						commit
						05d02f798f
					
				
					 1 changed files with 28 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -92,6 +92,30 @@ static void prim_import(EvalState & state, Value * * args, Value & v)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Return a string representing the type of the expression. */
 | 
			
		||||
static void prim_typeOf(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceValue(*args[0]);
 | 
			
		||||
    string t;
 | 
			
		||||
    switch (args[0]->type) {
 | 
			
		||||
        case tInt: t = "int"; break;
 | 
			
		||||
        case tBool: t = "bool"; break;
 | 
			
		||||
        case tString: t = "string"; break;
 | 
			
		||||
        case tPath: t = "path"; break;
 | 
			
		||||
        case tNull: t = "null"; break;
 | 
			
		||||
        case tAttrs: t = "attrs"; break;
 | 
			
		||||
        case tList: t = "list"; break;
 | 
			
		||||
        case tLambda:
 | 
			
		||||
        case tPrimOp:
 | 
			
		||||
        case tPrimOpApp:
 | 
			
		||||
            t = "lambda";
 | 
			
		||||
            break;
 | 
			
		||||
        default: abort();
 | 
			
		||||
    }
 | 
			
		||||
    mkString(v, state.symbols.create(t));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Determine whether the argument is the null value. */
 | 
			
		||||
static void prim_isNull(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +132,7 @@ static void prim_isFunction(EvalState & state, Value * * args, Value & v)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Determine whether the argument is an Int. */
 | 
			
		||||
/* Determine whether the argument is an integer. */
 | 
			
		||||
static void prim_isInt(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceValue(*args[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -116,7 +140,7 @@ static void prim_isInt(EvalState & state, Value * * args, Value & v)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Determine whether the argument is an String. */
 | 
			
		||||
/* Determine whether the argument is a string. */
 | 
			
		||||
static void prim_isString(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceValue(*args[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -124,7 +148,7 @@ static void prim_isString(EvalState & state, Value * * args, Value & v)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* Determine whether the argument is an Bool. */
 | 
			
		||||
/* Determine whether the argument is a Boolean. */
 | 
			
		||||
static void prim_isBool(EvalState & state, Value * * args, Value & v)
 | 
			
		||||
{
 | 
			
		||||
    state.forceValue(*args[0]);
 | 
			
		||||
| 
						 | 
				
			
			@ -1189,6 +1213,7 @@ void EvalState::createBaseEnv()
 | 
			
		|||
 | 
			
		||||
    // Miscellaneous
 | 
			
		||||
    addPrimOp("import", 1, prim_import);
 | 
			
		||||
    addPrimOp("__typeOf", 1, prim_typeOf);
 | 
			
		||||
    addPrimOp("isNull", 1, prim_isNull);
 | 
			
		||||
    addPrimOp("__isFunction", 1, prim_isFunction);
 | 
			
		||||
    addPrimOp("__isString", 1, prim_isString);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue