1

いくつかの事前定義された関数とレコードを含む clojure ファイルがあります

;outer.clj
(ns outer )
(defn foo [a] (println a))
(defrecord M [id])

そして今、使用法ファイル

;inner.clj
(ns inner (:use outer ))
(foo 2)    ;works fine
(println (:id (M. 4))) ;throws IllegalArgumentException: Unable to resolve classname: M

関数のインポートはうまくいくのに、レコードの定義はうまくいかないのはなぜですか? どのようにインポートすればよいですか?

4

2 に答える 2

5

defrecord は「隠れて」JVM クラスを生成するため、そのクラスをインポートする必要があります...

;inner.clj
(ns inner 
    (:use outer )
    (:import outer.M)
(foo 2)    ;works fine
(println (:id (M. 4))) ; works with import
于 2012-08-02T08:15:47.523 に答える
4

sw1nn は正しいですが、1.3 以降では個別にインポートする必要はありません。との両方defrecordで、他の関数と同様に/deftypeを介して利用できるコンストラクタ関数も作成します。userequire

both によって作成された関数は、フォームに従い、->MyType位置引数を取ります。

さらに、defrecordマップ引数を取る 2 番目のコンストラクター関数を作成しますmap->MyRecord

于 2012-08-02T18:40:51.130 に答える