总是喜欢标签而不是车队?

Always favor labels over flet?

在Lisp中,我们有两个函数来定义局部函数,fletlabels。两者基本上做的完全一样,它们都有相同的语法,它们唯一的(?)区别是 labels 局部函数可以相互引用,而 flet 它们不能。

是否有充分的理由使用 flet?换句话说:为什么不总是使用 labels 并完全摆脱 flet

据我所知,flet 只是 labels 的 95% 子集。我错过了什么吗?

fletlabels 都不是函数。它们是特殊的内置运算符。

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的使用表明局部函数正在使用递归。然后通过阅读 LABELSFLET 可以查看局部函数是否使用递归。

their only (?) difference is that with labels the local functions can refer to each other, with flet they can't.

flet中定义的函数也不能直接调用自身。因此可以重新定义一个外部(可能是全局)函数并在定义中使用外部函数。

通常最好不要在用户代码中使用它,因为它会使代码更难理解。它可能在生成的代码中很有用……有时。