Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro named-let (name (&rest bindings) &body body)
- `(labels ((,name (,@(mapcar (lambda (binding)
- (if (listp binding)
- (first binding)
- binding))
- bindings))
- ,@body))
- (,name ,@(mapcar (lambda (binding)
- (if (listp binding)
- (second binding)
- binding))
- bindings))))
- (named-let add ((a 10) (b 3))
- (if (zerop a)
- b
- (add (1- a) (1+ b))))
- --> 13
- (defmacro named-let (name (&rest bindings) &body body)
- (let ((temps (mapcar (lambda (b) (declare (ignore b)) (gensym)) bindings)))
- `(let (,@bindings)
- (block ,name
- (tagbody
- ,name
- (return-from ,name
- (flet ((,name (,@temps)
- (setf ,@(mapcan (lambda (binding temp)
- (list (if (listp binding)
- (first binding)
- binding)
- temp))
- bindings temps))
- (go ,name)))
- ,@body)))))))
- (named-let add ((a 10) (b 3))
- (if (zerop a)
- b
- (add (1- a) (1+ b))))
- --> 13
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement