#lang racket (require rackunit) (define-syntax case* (syntax-rules (else) [(case* to-match [possibility1 ans1] ... [else ans]) (let ([v to-match]) (cond [(equal? v possibility1) ans1] ... [else ans]))] [(case* to-match [possibility1 ans1] ... [possibilityn ansn]) (case* to-match [possibility1 ans1] ... [possibilityn ansn] [else (error 'case "nothing matched")])])) (check-equal? (case* (+ 1 2) [5 'no] [3 'yes]) 'yes) (check-equal? (case* (list 1 2) [5 'no] [7 'still-no] [(cons 1 (cons 2 '())) 'yes]) 'yes) (check-equal? (case* (+ 1 2) [3 'yes] [(/ 1 0) (/ 1 0)]) 'yes) (check-equal? (let ([x 2]) (case* (begin (set! x (add1 x)) x) [2 'no] [3 'yes] [(/ 1 0) (/ 1 0)])) 'yes) (check-equal? (case* (+ 1 3) [3 'yes] [else 'last]) 'last)