2012-01-16 43 views
2
core=> (defrecord Puffball [id name]) 
core.Puffball 
core=> (Puffball. 149 "Urist") 
#core.Puffball{:id 149, :name "Urist"} 
core=> (apply Puffball. [149 "Urist"]) 
CompilerException java.lang.RuntimeException: java.lang.ClassNotFoundException: Puffball., compiling:(NO_SOURCE_PATH:3) 
core=> (apply Puffball [149 "Urist"]) 
ClassCastException java.lang.Class cannot be cast to clojure.lang.IFn clojure.core/apply (core.clj:600) 

ベクターからパフボールを作成するにはどうすればよいですか? Clojureの1.3レコード定義でdefrecordコンストラクタで呼び出しを呼び出しますか?

答えて

8

は自動的にファクトリ関数を導入:

Clojure 1.3.0 
user=> (defrecord Puffball [id name]) 
user.Puffball 
user=> (apply ->Puffball [149 "Urist"]) 
#user.Puffball{:id 149, :name "Urist"} 

->Puffballは、 "位置" ファクトリ関数です。その名前からもわかるようにmap->Puffballがあります。 1.3.xの上のものではないため

0

(またはレコードの外このような機能を必要とする)、次は、Javaメソッドやコンストラクタとapplyをシミュレート:

 
(defmacro applyj 
    ([mc args] `(~mc [email protected])) 
    ([mc x args] `(~mc ~x [email protected])) 
    ([mc x y args] `(~mc ~x ~y [email protected])) 
    ([mc x y z args] `(~mc ~x ~y ~z [email protected]))) 
 
user=> (defrecord Puffball [id name]) 
user.Puffball 
user=> (applyj Puffball. [149 "Urist"]) 
#:user.Puffball{:id 149, :name "Urist"} 
関連する問題