Помогите мне написать Cond Macro в Clojure - PullRequest
2 голосов
/ 11 августа 2009

Я изучаю макросы в Clojure и хотел написать макрос "cond".

У меня возникла проблема с разложением аргументов в (условие) (аргументы) и записью рекурсивного макроса.

Пожалуйста, помогите мне.

1 Ответ

4 голосов
/ 11 августа 2009

Я пишу это, чтобы проиллюстрировать процесс. в этом коде много ошибок, но этот процесс поможет вам как можно быстрее развлечься :) запишите вызов вашего макроса и то, что вы хотите, чтобы этот вызов перевести (этот шаг не является обязательным;)

(my-cond (even? 4) 42 (odd? 4 24))

(if (even? 4) 42 (if (odd? 4) 24)))

написать шаблон для простейшего случая, а затем передать его (macroexpand-1 ...) и переворачивать, пока он не совпадет

(defmacro my-cond [test result] `(if ~test ~result nil))

(macroexpand-1 '(my-cond (even? 4) 42) ==> (if (even? 4) 42)

теперь сделайте его более общим

(defmacro my-cond [& cases]
  `(if (if ~(first cases) ~(second cases) ~(my-cond (drop 2 cases))

и затем поиграйте с ним в macroexpand-1, затем в macroexpand (без «-1»), чтобы убедиться, что он полностью расширяется в правильные регистры затем пройдитесь и очистите угловые случаи, где есть нечетное количество терминов и т. д. *

затем посмотрите в core.clj и посмотрите, как близко вы подошли.

...