没有用于flet
的flet*
,因为我可以在emacs lisp中找到用于let
的let*
--那么,在定义由flet
定义的单个函数多次使用的函数时,这四种替代方案中是否有哪一种更常用呢?在本例中,我希望在add1twice
中重用add1
函数,但不希望在外部使用它。
选项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))))
(所有这些都会产生相同的结果。)
发布于 2011-07-17 07:48:08
虽然在the documentation for flet
中不太清楚,但它的宏扩展表明它允许顺序绑定:
(defun add2 (x)
(flet ((add1 (x) (1+ x))
(add1twice (x)
(add1 (add1 x))))
(add1twice x)))
文档提到建立"let
-style bindings“-notlet*
-but尽管如此,上面的定义仍然有效。
发布于 2011-07-18 07:46:23
还有用于flet
的labels
,就像用于let
的let*
一样。
发布于 2020-01-06 06:22:12
顺便说一句,除了使用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
和cl-labels
更冗长一些。
https://stackoverflow.com/questions/6720954
复制相似问题