DefType défaut dans lein rempl ce que je fais mal?
-
25-10-2019 - |
Question
Par http://www.assembla.com/spaces/clojure/wiki/Datatypes
Je devrais être capable de taper la commande suivante dans une réponse lein:
(DEFTYPE Bar [a b c d e])
(déf b (Bar 1 2 3 4 5))
Mais quand je fais je reçois la sortie suivante:
java.lang.Exception: var Attendons, mais Bar est mappé à la classe user.Bar (NO_SOURCE_FILE: 31)
Je suis confus et je suis un newb complet pour Clojure toute aide est appréciée!
NOTE:. Essayé même code dans rempl standard clojure et vous obtiendrez le même problème
Réponse: Eh bien, je répondu à ma propre question avec un peu de recherche supplémentaire. Il se trouve que l'échantillon était mauvais. La bonne façon de instancier Bar serait:
(déf b (Bar. 1 2 3 4 5))
. à la fin du barreau de cet usage est important. Ne comprends toujours pas pourquoi (vous Clojure experts veuillez préciser si vous avez le temps depuis que je voudrais connaître les détails;).)
Merci à tous!
La solution
Je ne suis pas familier avec deftype
, mais de ce que je vois que vous avez besoin d'un point d'instancier un type, essayez ceci:
(deftype Bar [a b c d e])
(def b (Bar. 1 2 3 4 5))
Notez ce n'est pas Bar
, mais Bar.
. Voir les exemples par exemple ici:
- http://pastebin.com/9vqPpebT
- http://onclojure.com/2010/08 / 26 / réutilisables-procédé de mise en oeuvre à des fins de deftypes / (qui utilise
(new foo ...)
au lieu de(foo. ...)
)
Ce fil semble indiquer un changement dans deftype
:
ou, pour le mettre dans l'autre sens, la documentation sur la page que vous lien Paraître pas à jour.
Hope this helps.
Autres conseils
Il y a deux façons de réaliser ce que vous essayez de faire. Tout d'abord, nous allons passer l'exemple deftype
.
user=> (deftype Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 2 3 4 5))
#'user/b
user=> (:a b)
nil
user=> (.a b)
1
Vous remarquerez que quelques petites choses, ici. Comme nous l'avons mentionné, vous avez besoin « » instancier votre type. De plus, vous n'avez pas accès mot-clé ( ":" notation)., Accès uniquement sur le terrain ( "" encore une fois, avec a)
L'autre méthode consiste à définir un enregistrement avec defrecord
:
user=> (defrecord Bar [a b c d e])
user.Bar
user=> (def b (Bar. 1 3 5 7 9))
#'user/b
user=> (:a b)
1
user=> (.a b)
1
Cela vous donne à la fois le terrain et l'accès par mot clé. Cet accès est facilement imbriquée, ainsi, si vous décidez d'avoir un de vos champs contiennent un autre enregistrement.