From a887b49e0c5581bbadb019abb730216c9bb10db8 Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Mon, 7 Oct 2013 18:57:43 +0900 Subject: [PATCH] make-syntactic-closure generates a copy of existing closures, to allow for syntax generated syntax. --- eval.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/eval.c b/eval.c index 51e8ef08..72b81a79 100644 --- a/eval.c +++ b/eval.c @@ -360,12 +360,18 @@ static sexp sexp_make_macro (sexp ctx, sexp p, sexp e) { sexp sexp_make_synclo_op (sexp ctx, sexp self, sexp_sint_t n, sexp env, sexp fv, sexp expr) { sexp res; - if (! (sexp_symbolp(expr) || sexp_pairp(expr))) + if (! (sexp_symbolp(expr) || sexp_pairp(expr) || sexp_synclop(expr))) return expr; res = sexp_alloc_type(ctx, synclo, SEXP_SYNCLO); - sexp_synclo_env(res) = env; - sexp_synclo_free_vars(res) = fv; - sexp_synclo_expr(res) = expr; + if (sexp_synclop(expr)) { + sexp_synclo_env(res) = sexp_synclo_env(expr); + sexp_synclo_free_vars(res) = sexp_synclo_free_vars(expr); + sexp_synclo_expr(res) = sexp_synclo_expr(expr); + } else { + sexp_synclo_env(res) = env; + sexp_synclo_free_vars(res) = fv; + sexp_synclo_expr(res) = expr; + } return res; }