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)