总是喜欢标签而不是flet?

Gol*_*den 2 lisp common-lisp

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

有什么好的理由可以使用flet吗?换句话说:为什么不总是使用labelsflet完全摆脱?

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

Rai*_*wig 8

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

然后使用LABELSthen表示本地函数正在使用递归.然后通过读取LABELS或者FLET可以看到本地函数是否正在使用递归.

它们唯一(?)的区别在于,对于标签,局部函数可以相互引用,而flet则不能.

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

通常,不在用户代码中使用它是个好主意,因为它使代码更难理解.它可能在生成的代码中有用......有时候.