Вызов применить с помощью конструктора defrecord? - PullRequest
2 голосов
/ 16 января 2012
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)

Как я могу создавать пуфболы из векторов?

Ответы [ 2 ]

8 голосов
/ 16 января 2012

В определениях записей Clojure 1.3 автоматически вводятся заводские функции:

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, который делает то, что предлагает его название.

0 голосов
/ 17 января 2012

Для тех, кто не пользуется 1.3.x (или нуждается в такой функциональности вне записей), следующее apply имитирует методы и конструкторы java:

(defmacro applyj
  ([mc args] `(~mc ~@args))
  ([mc x args] `(~mc ~x ~@args))
  ([mc x y args] `(~mc ~x ~y ~@args))
  ([mc x y z args] `(~mc ~x ~y ~z ~@args)))
user=> (defrecord Puffball [id name])
user.Puffball
user=> (applyj Puffball. [149 "Urist"])
#:user.Puffball{:id 149, :name "Urist"}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...