예제 #1
0
파일: eval.c 프로젝트: samsonjs/lake
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;
  }
}
예제 #2
0
파일: GENER.c 프로젝트: doniexun/OrangeC
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);
    }
}
예제 #3
0
파일: eval.c 프로젝트: samsonjs/lake
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;
}