[Openmcl-devel] User contributions
    Ron Garret 
    ron at awun.net
       
    Sun Jun 14 18:21:20 PDT 2009
    
    
  
On Jun 13, 2009, at 6:20 PM, Ron Garret wrote:
>
> But I think this is the Right Answer:
>
> (defmacro defguardian (name)
>   `(defconstant ,name (if (boundp ',name) ,name (gensym))))
>
> Or if you're really being paranoid:
>
> (defmacro defguardian (name)
>   `(defconstant ,name (if (boundp ',name) ,name '#.(gensym))))
Bloody hell, that doesn't work either!
Do this:
(eval-when (:compile-toplevel :load-toplevel :execute)
(defun noisy-gensym () (format t "~&Calling gensym") (gensym))
(defmacro defguardian (name)
   `(defconstant ,name (if (boundp ',name) ,name (noisy-gensym))))
(defguardian foo)
(defun foo () foo)
)
Compile-and-load and observe that noisy-gensym gets called twice (and  
that foo and (foo) have different values).
This is getting ridiculous.  I humbly submit that there's a case to be  
made that allowing this kind of behavior is a bug in the standard.   
Or, failing that, a freedom that it might be wiser to choose to  
forego.  Both CLisp and SBCL do the Right Thing with a simple  
defconstant.  It should not be this hard to make a guardian.  In fact,  
at this point I still don't know a way to do it that actually works in  
a compiled file in CCL.
rg
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.clozure.com/pipermail/openmcl-devel/attachments/20090614/8b9d1374/attachment.htm>
    
    
More information about the Openmcl-devel
mailing list