Changeset 909
- Timestamp:
- Feb 16, 2005, 11:05:59 AM (20 years ago)
- File:
-
- 1 edited
-
trunk/ccl/lib/macros.lisp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/ccl/lib/macros.lisp
r903 r909 786 786 (let* ((construct (if e-c-p (if (eq e-c-p 'etypecase) e-c-p 'ctypecase) 'typecase)) 787 787 (types ()) 788 ( t-clause())789 (body ()))788 (body ()) 789 otherwise-seen-p) 790 790 (flet ((bad-clause (c) 791 791 (error "Invalid clause ~S in ~S form." c construct))) 792 792 (dolist (clause clauses) 793 793 (if (atom clause) 794 (bad-clause clause) 795 (destructuring-bind (typespec &body consequents) clause 796 (when (eq construct 'typecase) 797 (if (eq typespec 'otherwise) 798 (setq typespec t)) 799 (if (eq typespec t) 800 (if t-clause 801 (bad-clause clause) ; seen one already 802 (setq t-clause `( t nil ,@consequents))))) 803 (unless (and (eq construct 'typecase) 804 (eq typespec t)) 805 (when 806 (dolist (already types t) 807 (when (subtypep typespec already) 808 (warn "Clause ~S ignored in ~S form - shadowed by ~S ." clause construct (assq already clauses)) 809 (return))) 810 (push typespec types) 811 (unless (eq typespec t) 812 (setq typespec `(typep ,key-var ',typespec))) 813 (push `(,typespec nil ,@consequents) body)))))) 794 (bad-clause clause)) 795 (if otherwise-seen-p 796 (error "OTHERWISE must be final clause in ~S form." construct)) 797 (destructuring-bind (typespec &body consequents) clause 798 (when (eq construct 'typecase) 799 (if (eq typespec 'otherwise) 800 (progn (setq typespec t) 801 (setq otherwise-seen-p t)))) 802 (unless 803 (dolist (already types nil) 804 (when (subtypep typespec already) 805 (warn "Clause ~S ignored in ~S form - shadowed by ~S ." clause construct (assq already clauses)) 806 (return t))) 807 (push typespec types) 808 (setq typespec `(typep ,key-var ',typespec)) 809 (push `(,typespec nil ,@consequents) body)))) 814 810 (when e-c-p 815 811 (setq types `(or ,@(nreverse types))) 816 812 (if (eq construct 'etypecase) 817 (push `(t (values (%err-disp #.$XWRONGTYPE ,key-var ',types))) body) 818 (push `(t (setf ,keyform (ensure-value-of-type ,key-var ',types ',keyform)) 819 (go ,e-c-p)) body)))) 820 (when t-clause 821 (push t-clause body)) 813 (push `(t (values (%err-disp #.$XWRONGTYPE ,key-var ',types))) body) 814 (push `(t (setf ,keyform (ensure-value-of-type ,key-var ',types ',keyform)) 815 (go ,e-c-p)) body)))) 822 816 `(cond ,@(nreverse body)))) 823 817
Note:
See TracChangeset
for help on using the changeset viewer.
