总是喜欢标签而不是车队?
Always favor labels over flet?
在Lisp中,我们有两个函数来定义局部函数,flet
和labels
。两者基本上做的完全一样,它们都有相同的语法,它们唯一的(?)区别是 labels
局部函数可以相互引用,而 flet
它们不能。
是否有充分的理由使用 flet
?换句话说:为什么不总是使用 labels
并完全摆脱 flet
?
据我所知,flet
只是 labels
的 95% 子集。我错过了什么吗?
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
可以查看局部函数是否使用递归。
their only (?) difference is that with labels the local functions can refer to each other, with flet they can't.
flet
中定义的函数也不能直接调用自身。因此可以重新定义一个外部(可能是全局)函数并在定义中使用外部函数。
通常最好不要在用户代码中使用它,因为它会使代码更难理解。它可能在生成的代码中很有用……有时。
在Lisp中,我们有两个函数来定义局部函数,flet
和labels
。两者基本上做的完全一样,它们都有相同的语法,它们唯一的(?)区别是 labels
局部函数可以相互引用,而 flet
它们不能。
是否有充分的理由使用 flet
?换句话说:为什么不总是使用 labels
并完全摆脱 flet
?
据我所知,flet
只是 labels
的 95% 子集。我错过了什么吗?
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
可以查看局部函数是否使用递归。
their only (?) difference is that with labels the local functions can refer to each other, with flet they can't.
flet
中定义的函数也不能直接调用自身。因此可以重新定义一个外部(可能是全局)函数并在定义中使用外部函数。
通常最好不要在用户代码中使用它,因为它会使代码更难理解。它可能在生成的代码中很有用……有时。