Common lisp 在带有标签的公共Lisp源代码中调用rec的未记录函数?

Common lisp 在带有标签的公共Lisp源代码中调用rec的未记录函数?,common-lisp,Common Lisp,我注意到这个名为rec的函数在常见的Lisp代码中出现了很多次,但我没有找到它实际执行的操作的引用。有人能给我解释一下是什么吗?例如,它出现在另一个问题的某些代码中: rec不是代码中的全局函数,除非您自己定义它。这是一个用标签定义的本地辅助函数 特殊操作员执行与defun类似的任务,但绑定是本地的。这就像使用defparameter生成全局变量和let生成局部变量一样 (labels ((banana (arg1) ; make function banana (+

我注意到这个名为
rec
的函数在常见的Lisp代码中出现了很多次,但我没有找到它实际执行的操作的引用。有人能给我解释一下是什么吗?例如,它出现在另一个问题的某些代码中:


rec
不是代码中的全局函数,除非您自己定义它。这是一个用
标签定义的本地辅助函数

特殊操作员执行与
defun
类似的任务,但绑定是本地的。这就像使用
defparameter
生成全局变量和
let
生成局部变量一样

(labels ((banana (arg1)    ; make function banana
           (+ arg1 arg1)))
  (banana 10))             ; use it
; banana doesn't exist anymore
同:

(defun banan (arg1) ; make function banana
  (+ arg1 arg1))
(banana 10)         ; use it
; banana still exists
不同之处在于,香蕉不再存在于
标签
的外部,而使用
defun
时,您正在用辅助功能侵扰您的全局环境。由于
标签
中的函数是本地函数,因此可以使用常见名称,如
rec
loop
aux
,它们不会污染代码的其他部分

有一个类似的特殊操作符名为
flet
,其工作方式相同,但它在本地环境中不包含自己的函数,这会阻止您在其体内调用自己的函数。它们也很有用,但您很少称它们为
rec
,因为
rec
意味着它是递归的


这不是CL限制,而是编码风格。我确实经常在Scheme编程(另一种Lisp方言)中使用名称
rec
loop
,因此当我在CL中遇到它们时,我知道它们是什么,但在CL中,我从我的答案中看到了它们,因此我在名为
test
的全局函数中使用
aux
test aux
,请显示更多上下文。给出使用它的整个程序
rec
可能是本地的,也可能是特定于该程序的。如果查看,您将看到
rec
标签
表单中用作本地函数名。如果在任何地方将其更改为
banana
,它仍然可以工作,但
rec
表明这是一个递归调用。在这种情况下,它的尾部递归部分也使用了名称
loop
,但它会使
loop
宏在同一范围内不可用,因此它在Scheme中可能比CL更常见。@sylvester我没有添加太多信息,认为“rec”是lisp中使用的常见函数,但不知何故只是不适合在线记录。我已经用示例中的示例代码更新了我的线程。你能告诉我这个“rec”函数是什么,它到底在做什么吗?看看HyperSpec;它解释了这里发生了什么。
(defun banan (arg1) ; make function banana
  (+ arg1 arg1))
(banana 10)         ; use it
; banana still exists