On Sep 13, 2009, at 2:04 PM, John Cowan wrote:
> Abdulaziz Ghuloum scripsit:
>
>> I think one-pass gives you an approximation of let*-scoping
>> semantics while two-pass gives you recursive bindings. For
>> example, the following expression
>>
>> (let-syntax ((f (syntax-rules () ((_) 1))))
>> (let ()
>> (define (g) (f))
>> (define (f) 2)
>> (g)))
>>
>> evaluates to 1 in one-pass since at the time (f) is expanded,
>> only the outer f is known. In two-pass, it evaluates to 2
>> since (f) is expanded after the shadowing definition of f is
>> found.
>
> On my system, at least, Bigloo returns 1; PLT, Gauche, Chicken, scsh,
> Kawa, SISC, and Petite Chez all return 2; and Gambit and Guile return
> syntax errors. None of these systems, AFAIK, are two-pass in the
> sense
> of R6RS.
You forgot to start Gambit in hygienic mode; it returns 2 as well.
The issue of one-pass or two-pass has little to do with the example
you gave. It's entirely equivalent to:
(let-syntax ((f (syntax-rules () ((_) 1))))
(let ()
(letrec ((g (f))
(f 2))
(g))))
... so the syntax binding of `f' is not used at all. Bigloo's `let-
syntax' is known to be broken. Guile is, well, Guile; I expect that
one of the 2.0 series betas would return 2 as well, since the macro
expander has been switched out for psyntax.
--
Brian Mastenbrook
[email protected]
http://brian.mastenbrook.net/
_______________________________________________
r6rs-discuss mailing list
[email protected]
http://lists.r6rs.org/cgi-bin/mailman/listinfo/r6rs-discuss