我想创建一个函数,它返回其他几个函数的组合,例如
(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)
有没有办法解决这个问题?
答案 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)
。