7

我想创建一个函数,它返回几个其他函数的组合,这样

(funcall (compose 'f 'g) x) == (f (g x))

我觉得我在这方面失败得很惨。到目前为止我最好的尝试:

(defun compose (funcs)
  "composes several funcitons into one"
  (lambda (arg)
    (if funcs
        (funcall (car funcs) (funcall (compose (cdr funcs)) arg))
        arg)))

但由于某种原因,以下仍然返回 0:

(funcall (compose '(
           (lambda (a) (* a 3))
           (lambda (a) (+ a 2))
)) 0)

有没有办法解决这个问题?

4

2 回答 2

7

您的代码需要词法范围的 lambda,而 Emacs Lisp 默认不支持。如果您使用 Emacs 24,请设置lexical-bindingt,您的示例将按照编写的方式运行。

如果您使用的是较旧的 Emacs,则可以使用显式lexical-let形式创建词法范围的 lambda:

(require 'cl)

(defun compose (funcs)
  "composes several funcitons into one"
  (lexical-let ((funcs funcs))
    (lambda (arg)
      (if funcs
          (funcall (car funcs) (funcall (compose (cdr funcs)) arg))
        arg))))
于 2012-11-01T11:07:08.840 回答
0

如果您想要一个库,请参阅dash functional,它-compose需要(&rest fns).

于 2020-09-23T19:40:18.723 回答