gpt4 book ai didi

common-lisp - 带有标签的 Common Lisp 源代码中名为 rec 的未记录函数?

转载 作者:行者123 更新时间:2023-12-04 02:56:41 24 4
gpt4 key购买 nike

我注意到这个函数叫做 rec在 Common Lisp 代码中出现了很多次,但我没有找到它实际在做什么的引用。谁能向我解释它是什么?例如,它出现在另一个问题的一些代码中,How to convert a flat list into a nested tree-like structure? :

(defun mimicry (source pattern)
(labels ((rec (pattern)
(mapcar (lambda (x)
(if (atom x)
(pop source)
(rec x)))
pattern)))
(rec pattern)))

最佳答案

rec除非您自己定义它,否则它不是您代码中的全局函数。它是用 labels 定义的局部辅助函数.

特殊运算符 labels 执行与 defun 类似的任务除了绑定(bind)是本地的。就像你使用 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

不同之处在于 labels 的外部不再存在香蕉。而使用 defun你正在用辅助功能感染你的全局环境。由于 labels 中的函数是本地的,您可以使用常用名称,如 rec , loopaux作为他们的名字,他们不会污染代码的其他部分。

有一个类似的特殊运算符,称为 flet它的工作方式相同,但它在本地环境中不包含自己的函数,从而阻止您在其主体中调用您自己的函数。这些也很有用,但您很少称它们为 rec自从 rec暗示它是递归的。

这不是 CL 限制,而是编码风格。我确实使用名称 recloop经常在 Scheme 编程(另一种 Lisp 方言)中,所以当我在 CL 中遇到它们时,我知道它们是什么,但在 CL 中,我从我对 SO 的回答中看到我使用 auxtest-aux在名为 test 的全局函数中.

关于common-lisp - 带有标签的 Common Lisp 源代码中名为 rec 的未记录函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26206431/

24 4 0