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

Reply via email to