[racket] stumped by a little macro exercise
Hi,
In trying to take up the fall-through case challenge in "a little macro
exercise," I came up with this so far:
(define-syntax cas-cad-e
(syntax-rules (break go!)
((_ go! v () a) (let ((mtc #f)) (call/cc (lambda (break) . a))))
((cas-cad-e go! v (((bv ...) . b) . r) (a ...))
(cas-cad-e go!
v
r
(a ... (when (or mtc
(and (memq v '(bv ...))
(begin (set! mtc #t) #t)
))
. b))))
((_ v br . d) (cas-cad-e go! v (br . d) ()))))
I haven't looked at anyone else's solution yet. But setting aside questions
of concision and correctness, I can't even run it. Consider:
> (cas-cad-e 2 ((1) 3))
reference to undefined identifier: mtc
I don't get it. Isn't mtc safely bound in my let? Here's the expansion:
> (syntax->datum (expand '(cas-cad-e 2 ((1) 3))))
(let-values (((mtc) '#f))
(#%app
call/cc
(lambda (break)
(if (let-values (((or-part) (#%top . mtc)))
(if or-part
or-part
(if (#%app memq '2 '(1)) (begin (set! mtc '#t) '#t) '#f)))
(begin '3)
(#%app void)))))
Thanks in advance for your help,
RM
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20101009/691b2cbc/attachment.html>