Определите новый макрос defn, lein uberjar преуспевает, lein run не компилируется

Я определил свое собственное определение в пространстве имен mwm.

Мой новый код выглядит так

(mwm/defn foo [x] ...)

Все было хорошо, пока он назывался defn2, но после переименования его в defn и ссылки на исходный defn с помощью clojure.core/defn работает только «lein uberjar».

Когда я запускаю "lein run", компиляция завершается ошибкой

c:\data3\clojure\cdn77-purge>lein run
WARNING: defn already refers to: #'clojure.core/defn in namespace: mw.mwm, being
 replaced by: #'mw.mwm/defn
Exception in thread "main" java.lang.ClassNotFoundException: mw.mw1, compiling:(
mw/mw1.clj:40:1)
        at clojure.lang.Compiler.analyze(Compiler.java:6543)
        at clojure.lang.Compiler.analyze(Compiler.java:6485)
        at clojure.lang.Compiler$InvokeExpr.parse(Compiler.java:3791)
        at clojure.lang.Compiler.analyzeSeq(Compiler.java:6725)

Код можно найти по адресу https://github.com/mattiasw2/cdn77-purge/tree/renamed_to_defn


person mattias    schedule 11.11.2015    source источник


Ответы (2)


Вы можете попробовать использовать предложение :refer-clojure в пространстве имен mw.mwm:

(ns mw.mwm
  (:refer-clojure :exclude [defn])
  (:require
    [clojure.pprint :as pp]
    [clojure.walk :as walk])
  (:gen-class))
person coredump    schedule 11.11.2015
comment
Спасибо, но не сработало. Каким-то образом мне нужно убедиться, что lein сгенерирует класс mw.mwm до того, как он скомпилирует другие файлы. - person mattias; 12.11.2015

Я переместил свое собственное определение defn в отдельный проект, поэтому кажется, что вы не можете переопределить defn в том же проекте, в котором он используется.

person mattias    schedule 25.11.2015