Elisp Function Composition

During my recent Elisp hacking I've run into the situation enough times where I really wanted function composition that I officially implemented it for myself. While there is an apply-partially function, Elisp does not currently come with a compose function. Here's an Elisp definition,

;; ID: f0c736a9-afec-3e3f-455c-40997023e130
(defun compose (&rest funs)
  "Return function composed of FUNS."
  (lexical-let ((lex-funs funs))
    (lambda (&rest args)
      (reduce 'funcall (butlast lex-funs)
              :from-end t
              :initial-value (apply (car (last lex-funs)) args)))))

Here it is in action with three functions.

(funcall (compose 'prin1-to-string 'random* 'exp) 10)

I'll be using this in later posts (and linking back here when I do).

Load Comments

null program

Chris Wellons