[gambit-list] Problem using 'if' in a macro to conditionalydefinea let form
Logan, Patrick D
patrick.d.logan at intel.com
Tue Mar 29 21:44:43 EST 2005
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 at 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 at 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 at iro.umontreal.ca
> [mailto:gambit-list-bounces at iro.umontreal.ca] On Behalf Of Eric Merritt
> Sent: Tuesday, March 29, 2005 5:50 PM
> To: gambit-list at 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 at 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 at iro.umontreal.ca
> http://mailman.iro.umontreal.ca/mailman/listinfo/gambit-list
>
--
I'm a programmer, I don't have to spell correctly; I just have to
spell consistently
More information about the Gambit-list
mailing list