Advertisement
Guest User

Untitled

a guest
Nov 17th, 2018
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.43 KB | None | 0 0
  1. (defmacro named-let (name (&rest bindings) &body body)
  2. `(labels ((,name (,@(mapcar (lambda (binding)
  3. (if (listp binding)
  4. (first binding)
  5. binding))
  6. bindings))
  7. ,@body))
  8. (,name ,@(mapcar (lambda (binding)
  9. (if (listp binding)
  10. (second binding)
  11. binding))
  12. bindings))))
  13.  
  14. (named-let add ((a 10) (b 3))
  15. (if (zerop a)
  16. b
  17. (add (1- a) (1+ b))))
  18. --> 13
  19.  
  20.  
  21. (defmacro named-let (name (&rest bindings) &body body)
  22. (let ((temps (mapcar (lambda (b) (declare (ignore b)) (gensym)) bindings)))
  23. `(let (,@bindings)
  24. (block ,name
  25. (tagbody
  26. ,name
  27. (return-from ,name
  28. (flet ((,name (,@temps)
  29. (setf ,@(mapcan (lambda (binding temp)
  30. (list (if (listp binding)
  31. (first binding)
  32. binding)
  33. temp))
  34. bindings temps))
  35. (go ,name)))
  36. ,@body)))))))
  37.  
  38. (named-let add ((a 10) (b 3))
  39. (if (zerop a)
  40. b
  41. (add (1- a) (1+ b))))
  42. --> 13
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement