git @ Cat's Eye Technologies Robin / 686960c
Rewrite boolean operators as functions. Chris Pressey 4 years ago
4 changed file(s) with 17 addition(s) and 27 deletion(s). Raw diff Collapse all Expand all
2222 ? abort
2323
2424 | (and #t #f #f)
25 ? abort (illegal-arguments (#t #f #f))
25 ? abort (illegal-arguments
2626
2727 `and` expects both of its arguments to be booleans.
2828
4141
4242 '<<SPEC'
4343
44 (define and (fexpr (args env)
45 (if (equal? (tail (tail args)) ())
46 (if (eval env (head args))
47 (if (eval env (head (tail args))) #t #f)
48 #f)
49 (abort (list (literal illegal-arguments) args)))))
44 (define and (fun (a b)
45 (if a (if b #t #f) #f)))
1717 exactly one argument.
1818
1919 | (boolean? #t #f)
20 ? abort (illegal-arguments (#t #f))
20 ? abort (illegal-arguments
2121
2222 | (boolean?)
23 ? abort (illegal-arguments ())
23 ? abort (illegal-arguments
2424
2525 '<<SPEC'
2626
27 (define boolean? (fexpr (args env)
28 (bind-args (b) args env
29 (if (equal? b #t)
27 (define boolean? (fun (b)
28 (if (equal? b #t)
29 #t
30 (if (equal? b #f)
3031 #t
31 (if (equal? b #f)
32 #t
33 #f)))))
32 #f))))
2222 ? abort
2323
2424 | (or #t #f #f)
25 ? abort (illegal-arguments (#t #f #f))
25 ? abort (illegal-arguments
2626
2727 `or` expects both of its arguments to be booleans.
2828
4141
4242 '<<SPEC'
4343
44 (define or (fexpr (args env)
45 (if (equal? (tail (tail args)) ())
46 (if (eval env (head args))
47 #t
48 (if (eval env (head (tail args))) #t #f))
49 (abort (list (literal illegal-arguments) args)))))
44 (define or (fun (a b)
45 (if a #t (if b #t #f))))
1919 `xor` expects exactly two arguments.
2020
2121 | (xor #f)
22 ? abort (illegal-arguments (#f))
22 ? abort (illegal-arguments
2323
2424 | (xor #t #f #f)
25 ? abort (illegal-arguments (#t #f #f))
25 ? abort (illegal-arguments
2626
2727 `xor` expects both of its arguments to be booleans.
2828
4040
4141 '<<SPEC'
4242
43 (define xor (fexpr (args env)
44 (bind-args (a b) args env
45 (or (and a (not b)) (and (not a) b)))))
43 (define xor (fun (a b)
44 (or (and a (not b)) (and (not a) b))))