在Lisp中,我们有两个函数来定义局部函数,flet
和labels
.两者基本上都是一样的,它们都具有相同的语法,它们唯一(?)的区别在于,labels
本地函数可以互相引用,flet
但它们不能.
有什么好的理由可以使用flet
吗?换句话说:为什么不总是使用labels
和flet
完全摆脱?
据我所知,flet
只是95%的子集labels
.我错过了什么吗?
无论是flet
不是labels
都是函数.它们是特殊的,内置的操作员.
FLET
是更简单的结构.定义的局部函数仅在正文中可见.LABELS
允许我们定义递归本地函数以及相互递归的本地函数.
CL-USER 7 > (let ((i 5))
(labels ((foo ()
(decf i) (bar))
(bar ()
(unless (zerop i)
(print i)
(foo))))
(foo)))
4
3
2
1
NIL
Run Code Online (Sandbox Code Playgroud)
因此FLET
,默认情况下使用simpler是一种很好的风格.
然后使用LABELS
then表示本地函数正在使用递归.然后通过读取LABELS
或者FLET
可以看到本地函数是否正在使用递归.
它们唯一(?)的区别在于,对于标签,局部函数可以相互引用,而flet则不能.
定义的函数flet
也不能直接调用自身.因此,可以重新定义外部(可能是全局)函数并在定义中使用外部函数.
通常,不在用户代码中使用它是个好主意,因为它使代码更难理解.它可能在生成的代码中有用......有时候.