match undefined hygienically wrapper forward refs on define (fixes issue #399)

This commit is contained in:
Alex Shinn 2017-03-26 21:16:36 +09:00
parent c03ae08bbd
commit ae1a2aa6be
2 changed files with 19 additions and 0 deletions

9
eval.c
View file

@ -150,6 +150,15 @@ sexp sexp_env_cell_define (sexp ctx, sexp env, sexp key,
if (sexp_car(ls) == key) { if (sexp_car(ls) == key) {
sexp_cdr(ls) = value; sexp_cdr(ls) = value;
return ls; 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_gc_preserve2(ctx, cell, ls);
sexp_env_push(ctx, env, cell, key, value); sexp_env_push(ctx, env, cell, key, value);

View file

@ -540,6 +540,16 @@
'#(b))))) '#(b)))))
(test '#(b) (vector-lit))) (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-end)
(test-begin "5 Program structure") (test-begin "5 Program structure")