Lisp 总是喜欢标签而不是flet?

Lisp 总是喜欢标签而不是flet?,lisp,common-lisp,Lisp,Common Lisp,在Lisp中,我们有两个函数来定义局部函数,flet和labels。两者基本上都是一样的,它们都有相同的语法,它们唯一的(?)区别是,对于标签本地函数可以相互引用,而对于flet它们不能 使用flet有什么好的理由吗?换句话说:为什么不总是使用标签,彻底摆脱flet 就我所见,flet只是标签的95%子集。我遗漏了什么吗?两个flet标签都不是函数。它们是特殊的、内置的操作员 FLET是更简单的构造。定义的局部函数仅在主体中可见标签允许我们定义递归局部函数以及相互递归的局部函数 CL-USER

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

使用flet有什么好的理由吗?换句话说:为什么不总是使用
标签
,彻底摆脱
flet


就我所见,
flet
只是
标签的95%子集。我遗漏了什么吗?

两个
flet
标签都不是函数。它们是特殊的、内置的操作员

FLET
是更简单的构造。定义的局部函数仅在主体中可见<代码>标签
允许我们定义递归局部函数以及相互递归的局部函数

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
是一种很好的风格。

然后,使用
标签
表示本地函数正在使用递归。然后通过阅读
标签
FLET
可以看到局部函数是否使用递归

它们唯一的区别是,有了标签,局部函数可以互相引用,而有了flet,它们就不能互相引用

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


一般来说,最好不要在用户代码中使用它,因为这会使代码更难理解。它在生成的代码中可能很有用。。。有时。

let*
是要
let
就像
标签
是要
flet
@Baggers不太一样。标签可以引用以前和以后的函数绑定。让*只参考以前的绑定。@Xach:谢谢,伙计,我完全错了:)哇,和往常一样,答案太棒了。谢谢:-)值得注意的是,使用SQRT的示例引入了未定义的行为,per@Xach:Thank,我在尝试给出一个示例时忘记了这一点。。。