Advertisement
Guest User

Untitled

a guest
Dec 5th, 2018
174
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.00 KB | None | 0 0
  1. (defmacro cee-case ((value &key (test #'eql)) &body cases)
  2. (let ((block-name (gensym "CEE-CASE-BLOCK"))
  3. (gensyms (loop for case in cases collect (gensym "CEE-CASE-ENTRY-POINT"))))
  4. `(block ,block-name
  5. (macrolet ((break-from-cee-case (&rest values)
  6. `(return-from ,',block-name (values ,@values))))
  7. (tagbody
  8. ,@(loop
  9. for (case-value . case-body) in cases
  10. for tag in gensyms
  11. collect `(when (funcall ,test ,case-value ,value)
  12. (go ,tag)))
  13. ,@(loop
  14. for (case-value . case-body) in cases
  15. for tag in gensyms
  16. appending `(,tag ,@case-body)))))))
  17.  
  18. (cee-case ((* 7 6) :test #'=)
  19. (21 (print "Maths is not my forte. Oops."))
  20. (42 (print "There's no escape from"))
  21. (43 (print "Hitchhiker's Guide to the Galaxy jokes")
  22. (break-from-cee-case :oh-dear :oh-my))
  23. (44 (print "This looks a bit BASIC actually.")))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement