static LakeVal *_lambda(LakeCtx *ctx, Env *env, LakeList *expr) { /* (lambda (a b c) ...) */ if (LIST_N(expr) >= 3 && lake_is_type(TYPE_LIST, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "lambda" symbol */ LakeList *params = LIST(list_shift(expr)); LakeList *body = expr; return VAL(fn_make(params, NULL, body, env)); } else if (LIST_N(expr) >= 3 && lake_is_type(TYPE_DLIST, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "lambda" symbol */ LakeDottedList *def = DLIST(list_shift(expr)); LakeList *params = dlist_head(def); LakeSym *varargs = SYM(dlist_tail(def)); LakeList *body = expr; return VAL(fn_make(params, varargs, body, env)); } else if (LIST_N(expr) >= 3 && lake_is_type(TYPE_SYM, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "lambda" symbol */ LakeSym *varargs = SYM(list_shift(expr)); LakeList *body = expr; return VAL(fn_make(list_make(), varargs, body, env)); } else { invalid_special_form(expr, "lambda requires at least 2 parameters"); return NULL; } }
static void exec( char *program, char *param ) { static char *args[3]; int retcode; assert( program != NULL ); assert( param != NULL ); #if DEBUG printf("*** Search '%s'\n", program ); #endif fn_split( program ); args[0] = xfind( fn_make(".exe"), getrundir() ); args[1] = param; args[2] = NULL; #if DEBUG printf("*** Run '%s' '%s'\n", args[0], args[1] ); #endif retcode = spawnvp( P_WAIT, args[0], (void *)args ); if ( retcode > 0 ) { fprintf( stderr, "\n'%s' exitcode = %d\n", program, retcode ); if (! get_option(OPT_KEEPRSP) ) unlink( RESPONSE ); exit( retcode ); } else if ( retcode < 0 ) { perror( program ); if (! get_option(OPT_KEEPRSP) ) unlink( RESPONSE ); exit(1); } }
static LakeVal *_define(LakeCtx *ctx, Env *env, LakeList *expr) { /* TODO: make these more robust, check all expected params */ /* (define x 42) */ if (LIST_N(expr) == 3 && lake_is_type(TYPE_SYM, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "define" symbol */ LakeSym *var = SYM(list_shift(expr)); LakeVal *form = list_shift(expr); env_define(env, var, eval(ctx, env, form)); } /* (define (inc x) (+ 1 x)) */ else if (LIST_N(expr) >= 3 && lake_is_type(TYPE_LIST, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "define" symbol */ LakeList *params = LIST(list_shift(expr)); LakeSym *var = SYM(list_shift(params)); LakeList *body = expr; env_define(env, var, VAL(fn_make(params, NULL, body, env))); } /* (define (print format . args) (...)) */ else if (LIST_N(expr) >= 3 && lake_is_type(TYPE_DLIST, LIST_VAL(expr, 1))) { list_shift(expr); /* drop the "define" symbol */ LakeDottedList *def = DLIST(list_shift(expr)); LakeList *params = dlist_head(def); LakeSym *varargs = SYM(dlist_tail(def)); LakeSym *var = SYM(list_shift(params)); LakeList *body = expr; env_define(env, var, VAL(fn_make(params, varargs, body, env))); } else { invalid_special_form(expr, "define requires at least 2 parameters"); } return NULL; }