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