I don't really like have the call-with-values and apply there, so here's another version. It makes the macro a bit longer with the additional case and has the pattern duplicated once, but it seems worth it:
(define-syntax cas-cad-e (syntax-rules () [(_ e) (begin e (void))] [(_ e [(n ...) code ...] ... [(n_l ...) code_l ...]) (let/ec esc (syntax-parameterize ([break (make-rename-transformer #'esc)]) (let* ([tmp e] [earlier? #f] [earlier? (if (or earlier? (equal? tmp n) ...) (begin code ... #t) earlier?)] ...) (when (or earlier? (equal? tmp n_l) ...) code_l ...))))])) Regarding Shriram's bug. The only thing that occurs to me is that you'd want eqv? and a ' on the ns, to be more like case. Jay On Fri, Oct 8, 2010 at 10:39 PM, Jay McCarthy <jay.mccar...@gmail.com> wrote: > You got me > > Sent from my iPhone > > On Oct 8, 2010, at 10:33 PM, Eli Barzilay <e...@barzilay.org> wrote: > >> 8 minutes ago, Jay McCarthy wrote: >>> Alright, here's the version with no mutation: >> >> (cas-cad-e 1 [(1) (values 1 2 3)]) >> >> In other words: >> >> (define-syntax-rule (cas-cad-e e [(n ...) code ...] ...) >> (let/ec esc >> (syntax-parameterize ([break (make-rename-transformer #'esc)]) >> (let*-values ([(tmp) e] >> [(earlier? ret) (values #f (void))] >> [(earlier? ret) >> (if (or earlier? (equal? tmp n) ...) >> (values #t (call-with-values (lambda () code ...) >> list)) >> (values earlier? ret))] >> ...) >> (apply values ret))))) >> >> -- >> ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: >> http://barzilay.org/ Maze is Life! > -- Jay McCarthy <j...@cs.byu.edu> Assistant Professor / Brigham Young University http://teammccarthy.org/jay "The glory of God is Intelligence" - D&C 93 _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users