2012-01-16 5 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) 

어떻게 벡터로 puffball을 만들 수 있습니까? 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

(또는 외부 기록 그러한 기능이 필요), 다음은 자바 메소드 및 구성과 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"} 
관련 문제