;;; Isn't the DYNAMIC-EXTENT declaration wrong on
;;;
;;; (flet ((id (&rest args) args))
;;; (compose #'id #'id))
;;;
;;; ?
(defun compose (function &rest more-functions)
"Returns a function composed of FUNCTION and MORE-FUNCTIONS that applies its
arguments to to each in turn, starting from the rightmost of MORE-FUNCTIONS,
and then calling the next one with the primary value of the last."
(declare (optimize (speed 3) (safety 1) (debug 1)))
(reduce (lambda (f g)
(lambda (&rest arguments)
(declare (dynamic-extent arguments))
(funcall f (apply g arguments))))
more-functions
:initial-value function))
Similiar for MULTIPLE-VALUE-COMPOSE, CURRY, and RCURRY.
-T.