Я реализовал свой собственный Lisp поверх node.js, я могу запустить s-выражения следующим образом:
(assert (= 3 (+ 1 2))) (def even? (fn [n] (= 0 (bit-and n 1)))) (assert (even? 4)) (assert (= false (even? 5)))
Теперь я хотел бы добавить макросы - функцию defmacro
, но это то, где я застрял. Мне интересно, как макросистемы реализованы в других Lisps, но я не мог найти много указателей (кроме this и this).
Я посмотрел на макросистему Clojure - Lisp, с которой я больше всего знаком - но это казалось слишком сложным, и я не мог найти дополнительные подсказки, которые я могу легко применить (макрос Clojure в конечном счете компилировать в байтовый код, который не применяется к javascript, также я не мог понять функцию macroexpand1
.)
Итак, мой вопрос: при реализации Lisp без макросов, но с AST, как добавить макросную систему, например макросистему Clojure? Может ли эта макросистема быть реализована в Lisp или требуется ли дополнительные возможности в реализации на языке хоста?
Еще одно замечание: я еще не реализовал quote
('
), потому что не мог понять, какие значения должны быть в возвращаемом списке. Должны ли они содержать элементы или объекты AST, такие как Symbol
и Keyword
(последнее относится к Clojure)?