我们可以定义一个递归函数,factorial
例如,YCombinator
如下
;;; elisp
;;; This code works. Thanks to
;;; https://www.diegoberrocal.com/blog/2015/10/12/y-combinator-in-emacs-lisp/
(setq lexical-binding t) ;;; lexical == static ??
(defun YCombinator (f)
(funcall #'(lambda (x) (funcall f
#'(lambda (y) (funcall (funcall x x) y))))
#'(lambda (x) (funcall f
#'(lambda (y) (funcall (funcall x x) y))))
)
)
(setq meta-factorial
#'(lambda (f) #'(lambda (n) (if (eq n 0) 1 (* n (funcall f (1- n)))))))
(funcall (YCombinator meta-factorial) 4) ;; ===> 24
我已经了解了 Y 组合器是什么,并且知道它是如何以数学方式定义的。
Y: f -> ( (x -> f(x x)) (x -> f(x x)) )
但我发现很难实施。特别是,我对 的定义YCombinator
似乎更接近数学定义,但未能定义factorial
。
;; this code fails!
(defun YCombinator (f)
(funcall #'(lambda (x) (funcall f
#'(funcall x x)))
#'(lambda (x) (funcall f
#'(funcall x x)))
)
)
问题
- 为什么会这样?我错过了什么?
- 为什么我们需要设置
lexical-binding
为t
? - (e)lisp 翻译器是否有 lambda 表达式?