【发布时间】:2011-04-01 22:42:53
【问题描述】:
McCarthy's 基本 S 函数和谓词是 atom、eq、car、cdr、cons
然后他继续添加他的基本符号,以便能够编写他所谓的 S-Function:quote、cond、lambda、label
在此基础上,我们将这些称为“LISP 原语”(尽管我对类型谓词如 numberp 持开放态度)
您将如何在您选择的 LISP 中仅使用这些原语来定义 defmacro 函数? (包括 Scheme 和 Clojure)
【问题讨论】:
-
Defmacro本身是一个宏,而不是一个函数。 -
@Issac Hodes:再检查一下,Clojure 中的 defmacro 是一个宏
-
艾萨克,你错过了一些东西。在 (def ...) 结束后立即查看。
-
Lisp 中的每个宏都只是一个绑定到 lambda 的符号,并在某处设置了一个小标志,不知何故,eval 会检查,如果设置,则会导致 eval 在宏扩展时调用 lambda 并替换带有返回值的表单。如果您查看 defmacro 宏本身,您会发现它所做的只是重新排列事物,以便您获得一个 var 的 def 以将 fn 作为其值,然后在该 var 上调用 .setMacro,就像核心一样。 clj 正在手动处理 defmacro 本身,因为它还没有用于定义 defmacro 的 defmacro。
-
对,这确实有道理——我想这确实意味着我应该将它视为一个宏。我想我是从错误的角度来的!谢谢你送我上火车:)
标签: macros clojure lisp scheme primitive