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!

Était-ce utile?

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:

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top