Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro cee-case ((value &key (test #'eql)) &body cases)
- (let ((block-name (gensym "CEE-CASE-BLOCK"))
- (gensyms (loop for case in cases collect (gensym "CEE-CASE-ENTRY-POINT"))))
- `(block ,block-name
- (macrolet ((break-from-cee-case (&rest values)
- `(return-from ,',block-name (values ,@values))))
- (tagbody
- ,@(loop
- for (case-value . case-body) in cases
- for tag in gensyms
- collect `(when (funcall ,test ,case-value ,value)
- (go ,tag)))
- ,@(loop
- for (case-value . case-body) in cases
- for tag in gensyms
- appending `(,tag ,@case-body)))))))
- (cee-case ((* 7 6) :test #'=)
- (21 (print "Maths is not my forte. Oops."))
- (42 (print "There's no escape from"))
- (43 (print "Hitchhiker's Guide to the Galaxy jokes")
- (break-from-cee-case :oh-dear :oh-my))
- (44 (print "This looks a bit BASIC actually.")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement