[Larceny-users] [long] identifier bindings and visibility across phases

Andre van Tonder andre at het.brown.edu
Tue Oct 6 15:19:06 EDT 2009


WOPPA is not exported from library DEF, so any attempt to refer to it from 
outside DEF should fail.  The behavior of Larceny and Ypsilon are correct,
and that of Ikarus and Mosh are incorrect.

On Tue, 6 Oct 2009, Marco Maggi wrote:

> I have written:
>> I  have   prepared  an  archive  of   test  files[1]  with
>> everything  in  it,  which  can  be  downloaded  from  the
>> "Downloads" page of Nausicaa[2].
>
> I admit  that there is  too much code  in the archive,  so I
> reduced it to the following:
>
> (library (sublib)
>  (export %bury %disinter)
>  (import (rnrs))
>  (define *objects*
>    (make-eq-hashtable))
>  (define (%bury key obj)
>    (hashtable-set! *objects* key obj))
>  (define (%disinter key)
>    (hashtable-ref *objects* key #f)))
>
> (library (lib)
>  (export define-thing thing)
>  (import (rnrs) (for (sublib) expand))
>  (define-syntax define-thing
>    (lambda (stx)
>      (syntax-case stx ()
> 	((_ ?key ?id)
> 	 (begin
> 	   (%bury (syntax->datum #'?key) #'?id)
> 	   #'(define dummy #f))))))
>  (define-syntax thing
>    (lambda (stx)
>      (syntax-case stx ()
> 	((_ ?key)
> 	 (with-syntax ((obj (%disinter (syntax->datum #'?key))))
> 	   #'(obj)))))))
>
> (library (def)
>  (export)
>  (import (rnrs) (lib))
>  (define (woppa) 123)
>  (define-thing woppa woppa))
>
> ;;;; the program follows
> (import (rnrs) (def) (lib))
> (write (thing woppa))
> (newline)
>
> which  works for Ikarus  and (somewhat)  for Mosh,  while it
> fails with  Ypsilon (my  original code worked  with Ypsilon,
> too); with Larceny, running the program prints:
>
> ------------------------------------------------------------
> Syntax violation: invalid reference
>
> No binding available for woppa in library (...program...)
>
> Form: woppa
>
> Trace:
>
>  (woppa)
>
>  (thing woppa)
>
>  (write (thing woppa))
>
>
> Error: no handler for exception #<record &compound-condition>
> Compound condition has these components:
> #<record &who>
>    who : "invalid reference"
> #<record &message>
>    message : "No binding available for woppa in library (...program...)"
> #<record &syntax>
>    form : woppa
>    subform : #f
>
> Terminating program execution.
> ------------------------------------------------------------
>
> now, DEFINE-THING  stores a syntax object  into a hashtable,
> and THING retrieves it; by changing the code in the (sublib)
> library to:
>
>  (define (%bury key obj)
>    (write 'bury)(newline)
>    (hashtable-set! *objects* key obj))
>  (define (%disinter key)
>    (write 'disinter)(newline)
>    (hashtable-ref *objects* key #f)))
>
> I see that  "bury" and "disinter" are printed,  so the error
> seems to  come from bad insertion of  the disinterred syntax
> object in the output form of the THING macro use.  Why is it
> so?
>
> TIA
> --
> Marco Maggi
>
> _______________________________________________
> Larceny-users mailing list
> Larceny-users at lists.ccs.neu.edu
> https://lists.ccs.neu.edu/bin/listinfo/larceny-users
>
>



More information about the Larceny-users mailing list