[Openmcl-devel] Why doesn't #$ eval at read time?
alex crain
alexcrain at mail.widgetworks.com
Sun Feb 6 13:45:51 PST 2005
The solution is to just do #.#$foo whenever you need #$foo to be
evaluated immediately (like in a CASE form)
My question is more about the nature of the #$foo macro, which
evaluates to OS::|foo| which in turn evaluates
to an external constant.
If OS::|foo| is always a constant, why not have #$foo evaluate at read
time?
I confess that I haven't dug through the code and that there may be
some kind of circular dependency somewhere
that requires the delayed evaluation, I'm brining it up on the off
chance that no one ever really thought about it.
:alex
On Feb 6, 2005, at 3:46 PM, David Steuber wrote:
> Hi,
>
> On Jan 25, 2005, at 9:25 PM, alex crain wrote:
>
>>
>> I just discovered that this doesn't work....
>>
>> (case event-type
>> (#$NSLeftMouseDragged
>> (stuff...))
>> (#$NSLeftMouseUp
>> (more-stuff...)))
>>
>> because it expands to
>>
>> ...
>> (COND ((EQ #:G7256 'OS::|NSLeftMouseDragged|))
>> ....
>
> Did you ever find a good solution for this? I would prefer to use
> CASE for this also but I have been using my own macro based on
> something Kent Pitman posted to c.l.l a while back:
>
> (defmacro case-equal (exp &body clauses)
> (let ((temp (gensym)))
> `(let ((,temp ,exp))
> (cond ,@(mapcar #'(lambda (clause)
> (destructuring-bind (keys . clause-forms)
> clause
> (if (eq keys 'otherwise)
> `(t , at clause-forms)
> (if (atom keys)
> `((equal ,temp ,keys)
> , at clause-forms)
> `((member ,temp ',keys :test
> #'equal)
> , at clause-forms)))))
> clauses)))))
>
> It would be nice to have #$foo fully evaluated for use in CASE.
>
More information about the Openmcl-devel
mailing list