On Thu, 2009-06-18 at 22:55 +0300, Abdulaziz Ghuloum wrote:
> On Jun 18, 2009, at 4:42 PM, Ramana Kumar wrote:
> 
> >> I already said I don't think it's 100% correct, but it works
> >> on most implementations, and it satisfies your requirements.
> >> If you don't want to use it, that's absolutely fine.
> 
> > Oh I do want to use it =) But I also want to see the 100% correct  
> > version =P
> 
> Okay.  We ditch generate-temporaries which had underspecified
> behavior.  How about the following?  [An idea clicked in my
> head, I wrote it down, and it worked the first time, and when
> I read the solution (2 lines really), it made no sense at all!
> This is bizarre!  Thanks Ramana!  Maybe someone can explain it
> to me. :-)]

>    (define (unbound-identifier? x)
>      (and
>        (free-identifier=? x (datum->syntax a.ctxt (syntax->datum x)))
>        (free-identifier=? x (datum->syntax b.ctxt (syntax->datum x))))))

That's clever, but it's broken:

$ cat b/t2.sps
#!r6rs
(import (rnrs) (for (b bound) expand))

(define-syntax if-unbound
   (lambda (x)
     (syntax-case x ()
       [(_ (id) then else)
        (if (unbound-identifier? #'id) #'then #'else)])))

(if-unbound (a.cons)
  (display "a.cons unbound\n")
  (display "a.cons bound (incorrect)\n"))

$ IKARUS_LIBRARY_PATH=. ikarus --r6rs-script b/t2.sps
a.cons bound (incorrect)

$ plt-r6rs ++path . b/t2.sps
a.cons unbound

$ larceny --path . --r6rs --program b/t2.sps
a.cons bound (incorrect)

$ ypsilon --sitelib . --r6rs b/t2.sps
a.cons unbound

It seems PLT and Ypsilon are broken about this because an unbound a.cons
and a bound a.cons must not be free-identifier=?.

I'm thinking there should be a standard (or common and portable with
compat libraries) primitive identifier-bound? predicate.

-- 
: Derick
----------------------------------------------------------------

Reply via email to