Class 协议实现何时创建?

Class 协议实现何时创建?,class,clojure,protocols,classloader,Class,Clojure,Protocols,Classloader,我很难理解Clojure中的协议是如何工作的。更具体地说,我认为我的问题与何时生成类有关(?) 我用下面这个简单的例子再现了我的问题。我有三个文件: core.clj (ns so.core (:require [so.soproto :refer :all]) (:import [so.soimpl AImpl]) ) (defn -main [] (println "Hello, World!")) (ns so.soproto) (defprotocol A (do-s

我很难理解Clojure中的协议是如何工作的。更具体地说,我认为我的问题与何时生成类有关(?)

我用下面这个简单的例子再现了我的问题。我有三个文件:

core.clj

(ns so.core
  (:require [so.soproto :refer :all])
  (:import  [so.soimpl AImpl])
)

(defn -main [] (println "Hello, World!"))
(ns so.soproto)

(defprotocol A
  (do-smth [this]))
(ns so.soimpl
    (:require [so.soproto :refer :all]))

(deftype AImpl
    []
  A
  (do-smth [this] (println "whatever")))
soproto.clj

(ns so.core
  (:require [so.soproto :refer :all])
  (:import  [so.soimpl AImpl])
)

(defn -main [] (println "Hello, World!"))
(ns so.soproto)

(defprotocol A
  (do-smth [this]))
(ns so.soimpl
    (:require [so.soproto :refer :all]))

(deftype AImpl
    []
  A
  (do-smth [this] (println "whatever")))
soimpl.clj

(ns so.core
  (:require [so.soproto :refer :all])
  (:import  [so.soimpl AImpl])
)

(defn -main [] (println "Hello, World!"))
(ns so.soproto)

(defprotocol A
  (do-smth [this]))
(ns so.soimpl
    (:require [so.soproto :refer :all]))

(deftype AImpl
    []
  A
  (do-smth [this] (println "whatever")))
现在,如果我尝试“
lein run
”,我会得到以下结果:

$ lein run
Exception in thread "main" java.lang.ClassNotFoundException: so.soimpl.AImpl
我可以使用以下程序从Emacs复制问题:

  • opencore.clj
  • 叫Emacs的苹果酒杰克进来
  • 将cider的REPL切换到名称空间so.core
  • 苹果酒蒸发缓冲液
当然,我也有同样的例外:

java.lang.ClassNotFoundException: so.soimpl.AImpl
现在,我可以通过执行以下操作从Emacs内部“修复”问题:

  • 切换到缓冲区soimpl.clj
  • 苹果酒蒸发缓冲液
  • 切换回core.clj
  • 苹果酒评估缓冲->现在一切正常

那么,我如何才能让“
lein run
”正常工作呢?我如何从cider/Emacs仅在core.clj上执行cider eval缓冲区,而不需要打开/评估包含协议实现的文件?

如果要导入类,则需要先编译它。将
:aot[so.soimpl]
添加到lein's project.clj中的
defproject
选项中

但是,请注意,使用AImpl并不需要AOT编译/导入AImpl。只需在其构造函数中引用

(:导入[so.soimpl AImpl])

(需要[so.soimpl:参考(->AImpl)])


查看此最新版本。

请编辑我的问题以修复术语错误:)谢谢您的帮助。。。我不熟悉require:reference中的“dash/superior”->thinngy。它与“引用:全部”有什么不同?(假设AImpl是我在so.soimpl中声明的唯一内容)
->AImpl
只是在
so.soimpl
命名空间中执行
(deftype AImpl…
时自动为您创建的工厂函数。