作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想创建一个函数,它返回几个其他函数的组合,这样
(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)
有办法解决吗?
最佳答案
您的代码需要词法作用域的 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))))
关于emacs - 有没有办法在 Elisp 中编写函数来组合函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13174659/
我是一名优秀的程序员,十分优秀!