boot2

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

089-pmatch-guards.scm (1256B)


      1 ; pmatch — (guard ...) clauses.
      2 
      3 ;; Single guard: passes -> body fires.
      4 (if (= 1
      5        (pmatch 4
      6          (,x (guard (= x 4)) 1)
      7          (else (sys-exit 90))))
      8     0 (sys-exit 1))
      9 
     10 ;; Single guard: fails -> next clause.
     11 (if (= 2
     12        (pmatch 4
     13          (,x (guard (= x 5)) (sys-exit 91))
     14          (,y 2)
     15          (else (sys-exit 92))))
     16     0 (sys-exit 2))
     17 
     18 ;; Multi-guard AND-fold.
     19 (if (= 3
     20        (pmatch 7
     21          (,n (guard (> n 0) (< n 10)) 3)
     22          (else (sys-exit 93))))
     23     0 (sys-exit 3))
     24 
     25 ;; Multi-guard short-circuits on first #f.
     26 (if (= 4
     27        (pmatch 7
     28          (,n (guard (> n 0) (< n 5)) (sys-exit 94))
     29          (,n 4)))
     30     0 (sys-exit 4))
     31 
     32 ;; Compiler-style dispatch: guarded fallback on atoms.
     33 (define (classify e)
     34   (pmatch e
     35     ((quote ,_)            'quote)
     36     ((if ,_ ,_ ,_)         'if)
     37     (,x (guard (symbol? x))  'var)
     38     (,x (guard (integer? x)) 'int)
     39     (else                    'unknown)))
     40 
     41 (if (eq? (classify '(quote 42))      'quote) 0 (sys-exit 5))
     42 (if (eq? (classify '(if a b c))      'if)    0 (sys-exit 6))
     43 (if (eq? (classify 'foo)             'var)   0 (sys-exit 7))
     44 (if (eq? (classify 99)               'int)   0 (sys-exit 8))
     45 (if (eq? (classify "string")         'unknown) 0 (sys-exit 9))
     46 
     47 (sys-exit 0)