(defun partial (fn &rest args) (lambda (&rest args2) (apply fn (append args args2)))) (defun curry-n (n func) (cond ((< n 0) (error "Too many arguments")) ((zerop n) (funcall func)) (t (lambda (&rest rest) (curry-n (- n (length rest)) (apply #'partial func rest)))))) (defmacro defcurry (name args &body body) `(defun ,name (&rest rest) (let ((func (lambda ,args ,@body))) (curry-n (- ,(length args) (length rest)) (apply #'partial func rest)))))