Переопределение «def» в Clojure - PullRequest
7 голосов
/ 21 ноября 2010

Есть ли способ определить новый макрос под именем def в Clojure?Я defmacro редактировал новый после попытки :refer-clojure :exclude оригинала, но он все равно использовал встроенное определение.

Я пытался включить определения функций в стиле схемы ((def (f x y) ...) как (defn f [x y] ...)) используя следующий код.

(defmacro def
  [ id & others ]
    (if (list? id)
        `(defn ~(first id) [~@(rest id)] ~@others)
        `(def ~id ~@others)))

Ответы [ 2 ]

7 голосов
/ 21 ноября 2010

def это не макрос, это особая форма.Он внедряет символ в текущее пространство имен.Вы не можете переопределить специальные формы, но даже если бы вы могли, как бы вы поступили так же?

Самый простой способ - написать макрос define на основе def и defn.Если вы хотите использовать def слово, вы можете написать обертку replace-my-def-with-normal-def вокруг всего модуля, то есть

(replace-my-def-with-normal-def

   (def x 0)
   (def y (inc x))
   (def z (inc y))
   (def (my-func a b) (println a b))

)

, но я не уверен, что это не нарушит другие определения, которые зависят отdef (например, defn).

3 голосов
/ 15 января 2012

Вы можете создать макрос с именем специальной формы (например, if), но он вам не поможет.Специальные формы оцениваются перед макросами, поэтому, если у вас есть макрос и специальная форма с тем же именем, специальная форма всегда будет использоваться.Больше информации здесь http://clojure.org/evaluation.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...