我實現我自己的Lisp語言上的Node.js的頂部,我可以運行s表達式是這樣的:如何實現Lisp宏系統?
(assert (= 3 (+ 1 2))) (def even? (fn [n] (= 0 (bit-and n 1)))) (assert (even? 4)) (assert (= false (even? 5)))
現在我想補充的宏 - 的defmacro
功能 - 但是這是我米卡住了。我想知道如何在其他Lisp實現宏系統,但我找不到許多指針(除了this和this)。
我看了一下Clojure宏系統 - 我最熟悉的Lisp - 但這似乎太複雜了,我找不到更多的線索,我可以隨時應用(Clojure宏最終編譯爲字節碼不適用於JavaScript,我也無法理解macroexpand1
函數。)
所以我的問題是:給定一個沒有宏但帶有AST的Lisp實現,如何添加像Clojure的宏這樣的宏系統系統?這個宏系統可以在Lisp中實現嗎,還是在宿主語言中需要額外的特性?
一個額外的評論:我還沒有實施quote
('
),但因爲我不知道返回列表中應該是什麼樣的值。它是否應該包含AST元素或對象,如Symbol
和Keyword
(後者是Clojure的情況)?
感謝您的回覆,我可以總結您的答案,如下所示: 對於'defun':1)評估AST(返回javascript'function'對象)2)執行javascripts函數3)將結果值作爲參數傳遞給lisp函數。這就是我已經在做的事情。 對於'defmacro':1)idem 2)skip 3)將javascript函數作爲參數傳遞給宏。 ''返回的結果應該是應該評估和執行的AST元素。 這留下了一個沒有答案的問題:「報價」應該返回什麼?它應該是AST元素或JavaScript函數和其他objs的列表嗎? – 2010-08-12 11:03:59
(quote ...)返回「stuff」列表,其中「stuff」的格式可能稍後會進行評估。 lisp的美妙之處在於它的列表表示與AST表示相同,因此返回列表或AST是等同的。 – dsm 2010-08-12 11:17:38
宏觀不評價其論點似乎是其本質的副作用,而不是它的主要定義屬性,對我來說。 – Svante 2010-08-12 11:41:30