Анонимные макросы в Clojure - PullRequest
4 голосов
/ 02 ноября 2010

В Common LISP вы можете сделать следующее

(macro lambda (x) (list (quote car) (list (quote cdr) x)))

Похоже, что это невозможно (анонимный макрос) в Clojure.

  1. Это правда?
  2. Почему это было оставлено?

Ответы [ 2 ]

4 голосов
/ 02 ноября 2010

В clojure.contrib.macro-utils есть некоторые macrolet (или другие вещи).Однако это пахнет немного как хак для меня.Включение в clojure.core находится на радаре TODO, но в данный момент не имеет высокого приоритета.

РЕДАКТИРОВАТЬ: см. Также здесь http://dev.clojure.org/display/design/letmacro.

1 голос
/ 02 ноября 2010

Насколько я понимаю (из чтения документации и источника ), в настоящее время Clojure (начиная с версии 1.2) поддерживает только именованные макросы, определенные с помощью defmacro.

Возможно, однако, что вы можете использовать внутреннюю часть Clojure для получения какого-то анонимного макроса, напрямую вызывая функцию Java Var.setMacro () для некоторой анонимной переменной var. Это то, что defmacro использует под капотом для создания макросов.

например. Вы можете сделать:

(def macro-var (var (fn [...] ...)))

(.setMacro macro-var)

И читатель Clojure впоследствии интерпретирует var, содержащийся в macro-var, как макрос. Однако вам придется выяснить, как все правильно определить, и в будущих версиях Clojure все может сломаться.

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

...