在这个网站上,他们说有10个LISP原语.原语是:atom, quote, eq, car, cdr, cons, cond, lambda, label, apply.
http://hyperpolyglot.wikidot.com/lisp#ten-primitives
Stevey估计有七个(或五个):
它是LISP概念纯度的一部分:你只需要七个(或五个?)原语来构建整个机器. http://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html
构建LISP机器的最小基元数是多少(即可以在LISP代码上运行eval/value函数的东西)?(他们是哪一个?)
(我明白你可以没有生活atom, label and apply)
我在node.js上实现了自己的Lisp,我可以像这样运行s表达式:
(assert (= 3 (+ 1 2))) (def even? (fn [n] (= 0 (bit-and n 1)))) (assert (even? 4)) (assert (= false (even? 5)))
现在我想添加宏 - defmacro功能 - 但这是我被卡住的地方.我想知道的宏系统是如何在其他的Lisp实现,但我无法找到许多指针(除了这个和这个).
我看过Clojure宏系统 - 我最熟悉的Lisp - 但这看起来太复杂了,我找不到我可以轻易应用的其他线索(Clojure宏最终编译成不适用的字节码对于javascript,我也无法理解这个macroexpand1功能.)
所以我的问题是:给定一个没有宏但带有AST的Lisp实现,如何添加像Clojure宏系统这样的宏系统?这个宏系统可以在Lisp中实现,还是在宿主语言的实现中需要额外的功能?
还有一句话:我还没有实现quote(')因为我无法弄清楚返回列表中应该包含哪种值.如果它包含AST的元件或类似的对象Symbol和Keyword(后者是用于Clojure的情况下)?
麦卡锡的基本S函数和谓语atom,eq,car,cdr,cons
接着,他添加到他的基本符号,以便能够写他所谓的S-功能:quote,cond,lambda,label
在此基础上,我们将这些称为"LISP原语"(尽管我对类型谓词的论证持开放态度numberp)
如何defmacro在您选择的LISP中仅使用这些原语来定义函数?(包括计划和Clojure)