Documentation
Evaluate the first clause whose car satisfies (funcall test
car obj).
Source
(defmacro switch ((obj &key (test #'eql)) &body clauses)
"Evaluate the first clause whose car satisfies (funcall test
car obj)."
;; NB: There is no need to do the find-if and the remove here, we
;; can just as well do them with in the expansion
(let ((default-clause (find-if (lambda (c) (eq t (car c))) clauses)))
(when default-clause
(setf clauses (remove default-clause clauses :test #'equalp)))
(let ((obj-sym (gensym))
(test-sym (gensym)))
`(let ((,obj-sym ,obj)
(,test-sym ,test))
(cond
,@(mapcar (lambda (clause)
(let ((keys (ensure-list (car clause)))
(form (cdr clause)))
`((or ,@(mapcar (lambda (key)
`(funcall ,test-sym ',key ,obj-sym))
keys))
,@form)))
clauses)
,@(when default-clause
`((t ,@(cdr default-clause)))))))))
Source Context