有没有办法在Elisp中编写函数来编写函数?

时间:2012-11-01 09:58:50

标签: emacs elisp

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

(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)

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

2 个答案:

答案 0 :(得分:6)

您的代码需要词法范围的lambda,默认情况下Emacs Lisp不支持。如果您使用的是Emacs 24,请将lexical-binding设置为t,您的示例将按照书面形式运行。

如果您使用的是较旧的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))))

答案 1 :(得分:0)

如果您想要一个库,请参见dash functional,其中有-compose占用(&rest fns)