Advertisement
Guest User

Untitled

a guest
Jul 16th, 2018
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.96 KB | None | 0 0
  1. (defmacro generate-lambda (lambda-list body)
  2. `#'(lambda ,lambda-list ,body))
  3. (defmacro partial-aux (func &rest args)
  4. (with-gensyms (function new-args llist)
  5. `(let ((,function ,func)
  6. (,new-args (mapcar #'eval ',args)))
  7. (let ((,llist (nthcdr (length ,new-args)
  8. (stop-at-special (sb-introspect:function-lambda-list ,function)))))
  9. `(generate-lambda ,,llist (funcall ,,function ,@(append ,new-args ,llist)))))))
  10. (defmacro partial (func &rest args)
  11. (eval `(partial-aux ,func ,@args))) ;; Example call: (funcall (partial #'subst 1 2) '(1 2 3)) --> (1 1 3)
  12. (defun stop-at-special (list &optional acc)
  13. (if (or (null list)
  14. (some #'(lambda (y) (equalp (car list) y))
  15. '(&key &optional)));Deliberately breaks on &rest and &body.
  16. (reverse acc)
  17. (stop-at-special (cdr list) (cons (car list) acc))))
  18. (defmacro with-gensyms (symbols &body body)
  19. `(let (,@(mapcar #'(lambda (sym)
  20. `(,sym ',(gensym))) symbols))
  21. ,@body))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement