3

おそらく明らかですが、このコードが与えられた場合(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))

なぜこの出力が得られるのですか?

#<ui$reify_str$reify__4722__4727 foo>

それ以外の:

foo

役立つ場合は、WindowsでClojureCLRを実行しています。ありがとう!

4

1 に答える 1

5

基本的な問題は、ClojureREPLが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))

(これはバニラClojureでのみテストしましたが、ClojureCLRでも同じだと思います。)

ただし、この時点では、メソッドを毎回再定義しているため、具体化するのではなく、実際の型を作成する方がほぼ適切です。(必要性を回避するために、ある種のグローバル状態を実行できると思いますが、…まあ、型を定義することが望ましい理由がわかります。)

于 2012-04-16T20:08:12.120 に答える