Dan*_*ter 3 clojure clojureclr
可能很明显,但是给出了这段代码(来自http://clojure.github.com/clojure/clojure.core-api.html#clojure.core/reify):
(defn reify-str []
(let [f "foo"]
(reify Object
(ToString [this] f))))
(defn -main [& args]
(println (reify-str))
(System.Console/ReadLine))
Run Code Online (Sandbox Code Playgroud)
为什么我得到这个输出?
#<ui$reify_str$reify__4722__4727 foo>
Run Code Online (Sandbox Code Playgroud)
代替:
foo
Run Code Online (Sandbox Code Playgroud)
我在Windows中运行ClojureCLR,如果有帮助的话.谢谢!
你的基本问题是Clojure REPL使用的print-method不是.toString.您必须print-method为您的类型定义.对于具体类型来说这有点烦人,因为它使它们变得冗长.你必须做这样的事情:
(defn reify-str []
(let [f "foo"
r (reify Object
(ToString [this] f))]
(defmethod clojure.core/print-method (type r) [this writer]
(print-simple f writer))
r))
Run Code Online (Sandbox Code Playgroud)
(我只在香草Clojure中测试过这个,但我认为它在ClojureCLR中是一样的.)
但是,在这一点上,你最好创建一个实际类型而不是reifying,因为你每次都在重新定义方法.(我想你可以做某种全局状态来避免必要性,但是......好吧,你可以看到为什么定义一个类型可能更好.)