diff --git a/eval.c b/eval.c index d7e0bc93..017abf6f 100644 --- a/eval.c +++ b/eval.c @@ -399,18 +399,6 @@ static sexp sexp_make_macro (sexp ctx, sexp p, sexp e) { return mac; } -sexp sexp_make_variable_transformer_op (sexp ctx, sexp self, sexp_sint_t n, sexp base_proc) { - sexp flags; - sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, base_proc); - if (sexp_procedure_variable_transformer_p(base_proc)) - return base_proc; - flags = sexp_make_fixnum(sexp_unbox_fixnum(sexp_procedure_flags(base_proc)) | SEXP_PROC_VARIABLE_TRANSFORMER); - return sexp_make_procedure(ctx, flags, - sexp_make_fixnum(sexp_procedure_num_args(base_proc)), - sexp_procedure_code(base_proc), - sexp_procedure_vars(base_proc)); -} - sexp sexp_make_synclo_op (sexp ctx, sexp self, sexp_sint_t n, sexp env, sexp fv, sexp expr) { sexp res; sexp_assert_type(ctx, sexp_envp, SEXP_ENV, env); diff --git a/include/chibi/eval.h b/include/chibi/eval.h index bbd905cf..ebbad05d 100644 --- a/include/chibi/eval.h +++ b/include/chibi/eval.h @@ -128,7 +128,6 @@ SEXP_API sexp sexp_warn_undefs_op (sexp ctx, sexp self, sexp_sint_t n, sexp from SEXP_API sexp sexp_make_lit (sexp ctx, sexp value); SEXP_API sexp sexp_make_opcode (sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp, sexp_proc1); SEXP_API sexp sexp_make_procedure_op (sexp ctx, sexp self, sexp_sint_t n, sexp flags, sexp num_args, sexp bc, sexp vars); -SEXP_API sexp sexp_make_variable_transformer_op (sexp ctx, sexp self, sexp_sint_t n, sexp base_proc); SEXP_API sexp sexp_define_foreign_aux (sexp ctx, sexp env, const char *name, int num_args, int flags, const char *fname, sexp_proc1 f, sexp data); SEXP_API sexp sexp_register_optimization(sexp ctx, sexp self, sexp_sint_t n, sexp f, sexp i); #if SEXP_USE_AUTO_FORCE diff --git a/lib/chibi/ast.c b/lib/chibi/ast.c index ab952197..50b295ca 100644 --- a/lib/chibi/ast.c +++ b/lib/chibi/ast.c @@ -108,6 +108,18 @@ sexp sexp_get_procedure_flags (sexp ctx, sexp self, sexp_sint_t n, sexp proc) { return sexp_make_fixnum(sexp_procedure_flags(proc)); } +sexp sexp_make_variable_transformer_op (sexp ctx, sexp self, sexp_sint_t n, sexp base_proc) { + sexp flags; + sexp_assert_type(ctx, sexp_procedurep, SEXP_PROCEDURE, base_proc); + if (sexp_procedure_variable_transformer_p(base_proc)) + return base_proc; + flags = sexp_make_fixnum(sexp_unbox_fixnum(sexp_procedure_flags(base_proc)) | SEXP_PROC_VARIABLE_TRANSFORMER); + return sexp_make_procedure(ctx, flags, + sexp_make_fixnum(sexp_procedure_num_args(base_proc)), + sexp_procedure_code(base_proc), + sexp_procedure_vars(base_proc)); +} + sexp sexp_get_opcode_name (sexp ctx, sexp self, sexp_sint_t n, sexp op) { if (! sexp_opcodep(op)) return sexp_type_exception(ctx, self, SEXP_OPCODE, op); @@ -701,6 +713,7 @@ sexp sexp_init_library (sexp ctx, sexp self, sexp_sint_t n, sexp env, const char sexp_define_foreign(ctx, env, "procedure-variadic?", 1, sexp_get_procedure_variadic_p); sexp_define_foreign(ctx, env, "procedure-variable-transformer?", 1, sexp_get_procedure_variable_transformer_p); sexp_define_foreign(ctx, env, "procedure-flags", 1, sexp_get_procedure_flags); + sexp_define_foreign(ctx, env, "make-variable-transformer", 1, sexp_make_variable_transformer_op); sexp_define_foreign(ctx, env, "copy-lambda", 1, sexp_copy_lambda); sexp_define_foreign_opt(ctx, env, "make-lambda", 4, sexp_make_lambda_op, SEXP_NULL); sexp_define_foreign_opt(ctx, env, "make-cnd", 3, sexp_make_cnd_op, SEXP_VOID); diff --git a/lib/chibi/ast.sld b/lib/chibi/ast.sld index 8cbcd0af..40b99919 100644 --- a/lib/chibi/ast.sld +++ b/lib/chibi/ast.sld @@ -29,7 +29,7 @@ macro-procedure macro-env macro-source macro-aux macro-aux-set! procedure-code procedure-vars procedure-name procedure-name-set! procedure-arity procedure-variadic? procedure-variable-transformer? - procedure-flags make-procedure + procedure-flags make-variable-transformer make-procedure bytecode-name bytecode-literals bytecode-source port-line port-line-set! port-source? port-source?-set! extend-env env-parent env-parent-set! env-lambda env-lambda-set! diff --git a/opcodes.c b/opcodes.c index fc66db3e..552fc698 100644 --- a/opcodes.c +++ b/opcodes.c @@ -197,7 +197,6 @@ _FN2(_I(SEXP_OBJECT), _I(SEXP_OBJECT), SEXP_NULL, "memq", 0, sexp_memq_op), _FN2(_I(SEXP_OBJECT), _I(SEXP_OBJECT), SEXP_NULL, "assq", 0, sexp_assq_op), _FN3(_I(SEXP_SYNCLO), _I(SEXP_ENV), SEXP_NULL, _I(SEXP_OBJECT), "make-syntactic-closure", 0, sexp_make_synclo_op), _FN1(_I(SEXP_OBJECT), _I(SEXP_OBJECT), "strip-syntactic-closures", 0, sexp_strip_synclos), -_FN1(_I(SEXP_PROCEDURE), _I(SEXP_PROCEDURE), "make-variable-transformer", 0, sexp_make_variable_transformer_op), _FN0(_I(SEXP_OPORT), "open-output-string", 0, sexp_open_output_string_op), _FN1(_I(SEXP_IPORT), _I(SEXP_STRING), "open-input-string", 0, sexp_open_input_string_op), _FN1(_I(SEXP_STRING), _I(SEXP_OPORT), "get-output-string", 0, sexp_get_output_string_op),