From ae1a2aa6be47998f2de8601ae77daf5b4cdb18fe Mon Sep 17 00:00:00 2001 From: Alex Shinn Date: Sun, 26 Mar 2017 21:16:36 +0900 Subject: [PATCH] match undefined hygienically wrapper forward refs on define (fixes issue #399) --- eval.c | 9 +++++++++ tests/r7rs-tests.scm | 10 ++++++++++ 2 files changed, 19 insertions(+) diff --git a/eval.c b/eval.c index 30bc6713..fd3af251 100644 --- a/eval.c +++ b/eval.c @@ -150,6 +150,15 @@ sexp sexp_env_cell_define (sexp ctx, sexp env, sexp key, if (sexp_car(ls) == key) { sexp_cdr(ls) = value; return ls; + } else if (sexp_cdr(ls) == SEXP_UNDEF && + sexp_synclop(sexp_car(ls)) && + sexp_synclo_env(sexp_car(ls)) == env && + sexp_synclo_expr(sexp_car(ls)) == key) { + /* handle an undefined renamed reference that would have */ + /* resolved to this binding, renamed to what we define here */ + sexp_car(ls) = key; + sexp_cdr(ls) = value; + return ls; } sexp_gc_preserve2(ctx, cell, ls); sexp_env_push(ctx, env, cell, key, value); diff --git a/tests/r7rs-tests.scm b/tests/r7rs-tests.scm index 4c39bd9d..e08412ff 100644 --- a/tests/r7rs-tests.scm +++ b/tests/r7rs-tests.scm @@ -540,6 +540,16 @@ '#(b))))) (test '#(b) (vector-lit))) +(let () + ;; forward hygienic refs + (define-syntax foo399 + (syntax-rules () ((foo399) (bar399)))) + (define (quux399) + (foo399)) + (define (bar399) + 42) + (test 42 (quux399))) + (test-end) (test-begin "5 Program structure")