Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defmacro generate-lambda (lambda-list body)
- `#'(lambda ,lambda-list ,body))
- (defmacro partial-aux (func &rest args)
- (with-gensyms (function new-args llist)
- `(let ((,function ,func)
- (,new-args (mapcar #'eval ',args)))
- (let ((,llist (nthcdr (length ,new-args)
- (stop-at-special (sb-introspect:function-lambda-list ,function)))))
- `(generate-lambda ,,llist (funcall ,,function ,@(append ,new-args ,llist)))))))
- (defmacro partial (func &rest args)
- (eval `(partial-aux ,func ,@args))) ;; Example call: (funcall (partial #'subst 1 2) '(1 2 3)) --> (1 1 3)
- (defun stop-at-special (list &optional acc)
- (if (or (null list)
- (some #'(lambda (y) (equalp (car list) y))
- '(&key &optional)));Deliberately breaks on &rest and &body.
- (reverse acc)
- (stop-at-special (cdr list) (cons (car list) acc))))
- (defmacro with-gensyms (symbols &body body)
- `(let (,@(mapcar #'(lambda (sym)
- `(,sym ',(gensym))) symbols))
- ,@body))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement