recursion - Paul Graham 在他的 Bel 引用文献中如何解决 mac 的循环性?

标签 recursion lisp

按照 Paul Graham 的 Bel 规范 ( bel reference ) 他这样定义“mac”宏:

(mac mac (n . rest)
`(set ,n (macro ,@rest)))

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

最佳答案

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

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

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

(defun car (cons)
  (car cons))
(defun cdr (cons)
  (cdr cons))
(defun cons (car cdr)
  (cons car cdr))

SBCL 中也有类似的代码。

它之所以有效,是因为编译器具有针对这些函数的内置代码生成器。此代码用于为它们创建运行时函数对象,因此您可以使用类似的东西

(symbol-function 'car)

关于recursion - Paul Graham 在他的 Bel 引用文献中如何解决 mac 的循环性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59712151/

相关文章:

java - 为什么这个方法不是递归的?

recursion - SWI Prolog - 列表递归

lisp - 在 LISP 中, "let"和 "with"有什么区别?

Lisp - 字符串连接

scheme - Scheme 中的收集器函数是如何工作的?

stream - CCL Lisp 中的破管错误

python - python递归问题

c - 递归添加有序元素

recursion - 是否可以在 Rust 中进行递归闭包?

arrays - 值不是数组类型