Paul Graham 如何在他的 Bel 参考文献中解决 mac 的循环问题?

hon*_*ami 2 lisp recursion

在 Paul Graham 的 Bel 规范(bel 参考)中,他以这种方式定义了 'mac' 宏:

(mac mac (n . rest)
`(set ,n (macro ,@rest)))
Run Code Online (Sandbox Code Playgroud)

这不是循环吗?如果您使用 'mac' 来定义 mac,解释器如何知道 mac 的值是什么?

Bar*_*mar 5

这不用于定义mac运算符。编译器已经内置了如何编译宏的知识。

这用于使定义对应用程序代码可见。

这种明显的循环可以在大多数 Lisp 实现中找到。许多年前,当我在 Symbolics 源代码中看到这一点时,我感到很困惑:

(defun car (cons)
  (car cons))
(defun cdr (cons)
  (cdr cons))
(defun cons (car cdr)
  (cons car cdr))
Run Code Online (Sandbox Code Playgroud)

SBCL 中有类似的代码。

它之所以有效,是因为编译器为这些函数内置了代码生成器。此代码用于为它们创建运行时函数对象,因此您可以使用诸如

(symbol-function 'car)
Run Code Online (Sandbox Code Playgroud)