boot2

Playing with the boostrap
git clone https://git.ryansepassi.com/git/boot2.git
Log | Files | Refs | README

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)