blob: e166493bd81ae4a02f99d406e962268db6d4b898 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
(defun sys:typecase-expander (form obj clauses)
(let* ((val (gensym))
(cond-pairs (collect-each ((cl clauses))
(tree-case cl
((type . body)
(cond
((eq type t)
^(t ,*(or body '(nil))))
((symbolp type)
^((typep ,val ',type) ,*(or body '(nil))))
(t :)))
(else (compile-error form
"~s: bad clause syntax: ~s"
'typecase else))))))
^(let ((,val ,obj))
(cond ,*cond-pairs
,*(if (eq (car form) 'etypecase)
^((t (throwf 'case-error
"~s: unhandled type: ~s"
'etypecase (typeof ,val)))))))))
(defmacro typecase (:form f obj . clauses)
(sys:typecase-expander f obj clauses))
(defmacro etypecase (:form f obj . clauses)
(sys:typecase-expander f obj clauses))
|