diff --git a/eval.c b/eval.c index 6d6fccca..5db590c1 100644 --- a/eval.c +++ b/eval.c @@ -806,6 +806,12 @@ static sexp analyze_lambda (sexp ctx, sexp x, int depth) { sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); else if (sexp_truep(sexp_memq(ctx, sexp_car(ls), sexp_cdr(ls)))) sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + if (! sexp_nullp(ls)) { + if (! sexp_idp(ls)) + sexp_return(res, sexp_compile_error(ctx, "non-symbol parameter", x)); + else if (sexp_truep(sexp_memq(ctx, ls, sexp_cadr(x)))) + sexp_return(res, sexp_compile_error(ctx, "duplicate parameter", x)); + } /* build lambda and analyze body */ res = sexp_make_lambda(ctx, tmp=sexp_copy_list(ctx, sexp_cadr(x))); if (sexp_exceptionp(res)) sexp_return(res, res); diff --git a/sexp.c b/sexp.c index 1503e5b2..94d1d096 100644 --- a/sexp.c +++ b/sexp.c @@ -439,6 +439,7 @@ void sexp_init_context_globals (sexp ctx) { const char** features; int i, endianess_check = 1; sexp type, *vec, print=NULL; + sexp_gc_var1(feature); sexp_context_globals(ctx) = sexp_make_vector(ctx, sexp_make_fixnum(SEXP_G_NUM_GLOBALS), SEXP_VOID); #if ! SEXP_USE_GLOBAL_SYMBOLS @@ -474,10 +475,15 @@ void sexp_init_context_globals (sexp ctx) { sexp_global(ctx, SEXP_G_FEATURES) = SEXP_NULL; sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = sexp_intern(ctx, (*(unsigned char*) &endianess_check) ? "little-endian" : "big-endian", -1); + sexp_gc_preserve1(ctx, feature); for (features=sexp_initial_features; *features; features++) { - sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); - sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = sexp_intern(ctx, *features, -1); + feature = sexp_intern(ctx, *features, -1); + if (sexp_not(sexp_memq(ctx, feature, sexp_global(ctx, SEXP_G_FEATURES)))) { + sexp_push(ctx, sexp_global(ctx, SEXP_G_FEATURES), SEXP_FALSE); + sexp_car(sexp_global(ctx, SEXP_G_FEATURES)) = feature; + } } + sexp_gc_release1(ctx); sexp_global(ctx, SEXP_G_NUM_TYPES) = sexp_make_fixnum(SEXP_NUM_CORE_TYPES); sexp_global(ctx, SEXP_G_TYPES) = sexp_make_vector(ctx, sexp_make_fixnum(SEXP_INIT_NUM_TYPES), SEXP_VOID);