In fact you don't need UNQUOTE-SPLICING and a nested BACKQUOTE if you generate the entire binding section. Works as good, but even funner.
`(let ,(if ...) ...)
-Patrick
-----Original Message----- From: Eric Merritt [mailto:cyberlync@gmail.com] Sent: Tue 3/29/2005 6:14 PM To: Logan, Patrick D Subject: Re: [gambit-list] Problem using 'if' in a macro to conditionalydefinea let form
Cool, thats a simple solution I should have thought of.
On Tue, 29 Mar 2005 18:04:05 -0800, Logan, Patrick D patrick.d.logan@intel.com wrote:
Ah, OK. Because the UNQUOTE within the LET bindings has to return something, and there is no "else" clause in the IF, you get by default a #!VOID.
Instead rewrite the IF to generate both bindings in the LET. Instead of UNQUOTE, use UNQUOTE-SPLICING...
`(let (,@(if (is-cool? somestuff) `((x ,somestuff) (z do-something-else-cool)) `((x ,somestuff)))) ...)
That should be close, plus or minus a typo or two.
-Patrick
-----Original Message----- From: gambit-list-bounces@iro.umontreal.ca [mailto:gambit-list-bounces@iro.umontreal.ca] On Behalf Of Eric Merritt Sent: Tuesday, March 29, 2005 5:50 PM To: gambit-list@iro.umontreal.ca Subject: Re: [gambit-list] Problem using 'if' in a macro to conditionalydefinea let form
see inline ->
On Tue, 29 Mar 2005 17:16:29 -0800, Logan, Patrick D patrick.d.logan@intel.com wrote:
Not sure what you really want to have expanded and what you want in
the
result. I have found it helpful to begin with the end in mind.
(define-macro (foo somestuff) `(let ((x ,sumstuff) ,(if (is-cool sumstuff) `(z (do-something-else-cool)))) (some-more-stuff))
So this would preferably expand in two ways depending on what 'sumstuff' is
(let ((x avalue) (z (do-something-else-cool))) (some-more-stuff))
or
(let ((x avalue)) (some-more-stuff))
However, the second option is impossible because the above macro will expand to
(let ((x avalue) #!void) (some-more-stuff)))
in the face of an uncool 'sumstuff'. At least thats what it looks like is happening when I expand the macro.
Assuming you want the initial form to look like...
(FOO SOMESTUFF)
Can you provide an example, i.e. replace SOMESTUFF with some actual stuff.
Ok simple enough. So lets say sumstuff is
'((cool 33) (not-cool 44))
and is-cool is defined as
(define (is-cool lst) (cond ((null? lst) #f) ((equal? 'cool (caar lst)) #t) (else (is-cool (cdr lst)))))
Then for this example, what do you want the final form to look like after expansion?
(let ((x avalue) (z (do-something-else-cool))) (some-more-stuff))
or
(let ((x avalue)) (some-more-stuff))
depending on the value of sumstuff
Now defining the macro is a simple matter of programming. Outside of
the
define-macro, you can play with quasiquotes to get just the data
looking
the way you want it.
Unfortunately, unless I am missing something big I can't for reasons stated above. Because although this
(let ((x avalue) (z (do-something-else-cool))) (some-more-stuff))
can be evaluated to just fine. I cannot get this
(let ((x avalue)) (some-more-stuff))
to result. In instances where sumstuff is (is-cool sumstuff) evaluates to false I get an ill-formed let error. _______________________________________________ Gambit-list mailing list Gambit-list@iro.umontreal.ca http://mailman.iro.umontreal.ca/mailman/listinfo/gambit-list