Here's a much shorter version that doesn't require goto emulation, and is also almost syntax-rules-kosher, modulo a syntax parameter for breaking:
------------------------------------------------------------------------------- #lang racket (provide cas-cad-e) (require racket/stxparam) (define-syntax-parameter break (lambda (stx) (raise-syntax-error #f "break must be used inside a cas-cad-e"))) (define-syntax helper (syntax-rules () [(_ v*s tail val [(v0 ...) e0 ...] [v e ...] ...) (helper (v0 ... . v*s) (when (memq val '(v0 ... . v*s)) tail e0 ...) val [v e ...] ...)] [(_ _ tail val) tail])) (define-syntax-rule (cas-cad-e expr [v e ...] ...) (let ([val expr]) (let/ec escape (syntax-parameterize ([break (make-rename-transformer #'escape)]) (helper () (void) val [v e ...] ...))))) ------------------------------------------------------------------------------- -- ((lambda (x) (x x)) (lambda (x) (x x))) Eli Barzilay: http://barzilay.org/ Maze is Life! _________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/users