Как реализовать макросистему Lisp?

Я реализовал свой собственный 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 функция - но это то, где я застрял. Мне интересно, как макросистемы реализованы в других Лиспах, но я не смог найти много указателей (кромеэтот а такжеэтот).

Я посмотрел на систему макросов Clojure - Lisp, с которым я больше всего знаком - но это казалось слишком сложным, и я не смог найти дополнительные подсказки, которые я мог бы легко применить (макросы Clojure в конечном итоге компилируются в байт-код, который не применяется к javascript, также я не мог понять смыслmacroexpand1 функция).

Итак, мой вопрос: с учетом реализации Lisp без макросов, но с AST, как можно добавить макросистему, подобную макросистеме Clojure? Может ли эта система макросов быть реализована в Лиспе, или она требует дополнительных возможностей в реализации на языке хоста?

Еще одно замечание: я не реализовалquote ('), потому что я не мог понять, какие значения должны быть в возвращаемом списке. Должен ли он содержать элементы AST или объекты типаSymbol а такжеKeyword (последнее относится к Clojure)?

Ответы на вопрос(0)

Ваш ответ на вопрос