在Lisp中,我们有两个函数来定义本地函数,flet
和labels
。两者基本上都是一样的,它们都有相同的语法,它们唯一的(?)不同的是,对于labels
,本地函数可以相互引用,而使用flet
,它们不能引用。
有什么好的理由使用flet
吗?换句话说:为什么不总是使用labels
,完全摆脱flet
呢?
据我所见,flet
只是labels
的95%的子集。我有遗漏什么吗?
发布于 2015-04-04 12:03:08
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
因此,默认情况下使用更简单的FLET
是很好的风格。
然后,LABELS
的使用表明本地函数使用递归。然后,通过读取LABELS
或FLET
,可以看到本地函数是否使用递归。
他们唯一的(?)不同之处在于,使用标签,本地函数可以相互引用,而flet则不能。
flet
中定义的函数也不能直接调用自己。因此,可以重新定义外部(可能是全局)函数,并在定义中使用外部函数。
一般来说,在用户代码中不使用它是个好主意,因为它会使代码更难理解。在生成的代码中可能很有用..。有时候。
https://stackoverflow.com/questions/29445358
复制相似问题