096-case.scm (1984B)
1 ; (case key clause...) -- evaluates key once, then walks clauses. 2 ; Each clause is ((datum...) body...) or (else body...). Datums are 3 ; literal (not evaluated) and matched eq?-style; body of the matched 4 ; clause is tail-evaluated. No-match (no else) returns UNSPEC. 5 6 ;; --- Basic match against a single datum ------------------------------ 7 (if (= 11 (case 1 ((1) 11) ((2) 22) (else 99))) 0 (sys-exit 1)) 8 (if (= 22 (case 2 ((1) 11) ((2) 22) (else 99))) 0 (sys-exit 2)) 9 10 ;; --- Multiple datums per clause -------------------------------------- 11 (if (= 7 (case 3 ((1 2 3) 7) ((4 5) 8) (else 9))) 0 (sys-exit 3)) 12 (if (= 8 (case 5 ((1 2 3) 7) ((4 5) 8) (else 9))) 0 (sys-exit 4)) 13 14 ;; --- else fires when no clause matches ------------------------------- 15 (if (= 99 (case 42 ((1) 1) ((2 3) 2) (else 99))) 0 (sys-exit 5)) 16 17 ;; --- No match, no else: UNSPEC (eq? to other UNSPECs) ---------------- 18 (if (eq? (case 7 ((1) 11)) (case 9 ((2) 22))) 0 (sys-exit 6)) 19 (if (not (eq? (case 7 ((1) 11)) #f)) 0 (sys-exit 7)) 20 21 ;; --- Symbols match by eq? -------------------------------------------- 22 (if (eq? 'red (case 'apple 23 ((banana) 'yellow) 24 ((apple cherry) 'red) 25 (else 'gray))) 26 0 (sys-exit 8)) 27 28 ;; --- Booleans match by eq? ------------------------------------------- 29 (if (= 1 (case #t ((#t) 1) ((#f) 2) (else 3))) 0 (sys-exit 9)) 30 (if (= 2 (case #f ((#t) 1) ((#f) 2) (else 3))) 0 (sys-exit 10)) 31 32 ;; --- Body has multi-form sequencing; last form is the value --------- 33 (define counter 0) 34 (if (= 9 (case 1 35 ((1) (set! counter (+ counter 5)) 36 (set! counter (+ counter 3)) 37 (+ counter 1)) 38 (else 0))) 39 0 (sys-exit 11)) 40 (if (= counter 8) 0 (sys-exit 12)) 41 42 ;; --- Key expression is evaluated only once --------------------------- 43 (define seen 0) 44 (define (bump) (set! seen (+ seen 1)) 2) 45 (if (= 22 (case (bump) ((1) 11) ((2) 22) (else 99))) 0 (sys-exit 13)) 46 (if (= seen 1) 0 (sys-exit 14)) 47 48 (sys-exit 23)