flet*
中没有flet
,因为我可以在emacs lisp中找到let*
中有let
–因此,这四个替代方案中的任何一个更惯用于定义一个函数多次使用的功能。 flet
定义的单个功能?在此示例中,add1
是我想在add1twice
中重用但不在其外部使用的功能。
选项1
(defun add2 (x)
(flet ((add1 (x) (1+ x)))
(flet ((add1twice (x)
(add1 (add1 x))))
(add1twice x))))
选项2
(defun add2 (x)
(flet ((add1twice (x)
(flet ((add1 (x) (1+ x)))
(add1 (add1 x)))))
(add1twice x)))
选项3
(defun add2 (x)
(flet ((add1twice (x)
(let (add1)
(fset 'add1 (lambda (x) (1+ x)))
(add1 (add1 x)))))
(add1twice x)))
选项4
(labels ((add1 (x) (1+ x)))
(defun add2 (x)
(flet ((add1twice (x)
(add1 (add1 x))))
(add1twice x))))
(所有这些都产生相同的结果。)
尽管在the documentation for flet
中不太清楚,但是它的宏扩展表明它可以容忍顺序绑定:
flet
文档中提到建立“ (defun add2 (x)
(flet ((add1 (x) (1+ x))
(add1twice (x)
(add1 (add1 x))))
(add1twice x)))
样式的绑定” — not let
,但是上面的定义仍然有效。
[您也有let*
代表labels
,就像flet
代表let*
。
顺便说一句,除了使用let
,您还可以通过cl-labels
手动进行此操作:
let*
诚然,它比(defun add2 (x)
(let* ((add1 (lambda (x) (1+ x)))
(add1twice (lambda (x) (funcall add1 (funcall add1 x)))))
(funcall add1twice x)))
和cl-flet
更为冗长。