Clojure est defrecord - comment l'utiliser?
Je suis d'essayer de créer mon propre immuable type de données/méthodes avec defrecord
en Clojure. Le but est d'avoir un type de données que je peux créer des instances d', puis d'appeler ses méthodes de retourner une nouvelle copie de lui-même avec muté variables. Dire que a et b sont des vecteurs. Je voudrais mettre à jour une valeur à la fois et de revenir une nouvelle copie de l'ensemble de la structure avec ces vecteurs mis à jour. De toute évidence, cela ne compile pas, je suis juste essayer de faire passer mes idées.
(defrecord MyType [a b]
(constructor [N]
; I'd like to build an initial instance, creating a and b as vectors of length N
)
(mutate-and-return []
; I'd like to mutate (assoc the vectors) and return the new structure, a and b modified
)
)
J'aimerais appeler le constructeur et ensuite le mutateur autant de fois que je le souhaiterais (il y en a d'autres fonctions qui ne sont pas muter, mais je ne veux pas rendre les choses plus complexes pour la question).
Alternativement, si ce n'est pas idiomatique Clojure, comment êtes-vous censé faire quelque chose comme cela?
- Parfois, vous voulez un composant au lieu de ce que defrecord fournit. Just sayin
Vous devez vous connecter pour publier un commentaire.
Voici comment vous définissez votre dossier:
Noter que dans Clojure vous n'avez pas définissent généralement les "méthodes" au sein de votre type d'enregistrement lui-même (la seule exception est si vous voulez mettre directement en œuvre d'une interface Java ou d'un protocole).
Un constructeur de base (avec le préfixe
->
) est généré automatiquement pour gratuit:Vous pouvez ensuite écrire plus sophistiqués constructeur de fonctions qui utilisent, par exemple,
Et "mutation-et-retour" est également livré gratuitement - vous pouvez simplement utiliser assoc:
(assoc-in foo [:b 0] 12)
(assoc foo :a [7 8 9] :b [3 4 5])
. Bien qu'en général, si vous voulez faire plus de fantaisie / complexe de mutation, vous voulez conclure dans un document distinct (bien nommé) de la fonction.Clojure defrecord exemple:
;;définir enregistrement d'Adresse
;;définir enregistrement de Personne
;;construire le constructeur
;;créer une personne
;;récupérer des valeurs