Sto tentando di creare i miei propri tipi/metodi immutabili con defrecord
in Clojure. L'obiettivo è avere un tipo di dati che posso creare istanze di e quindi chiamare i suoi metodi per restituire una nuova copia di se stesso con variabili mutate. Supponiamo che a e b siano vettori. Mi piacerebbe aggiornare un valore in entrambi e restituire una nuova copia dell'intera struttura con quei vettori aggiornati. Questo ovviamente non si compila, sto solo cercando di far passare le mie idee.Defrecord di Clojure - come si usa?
(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
)
)
mi piacerebbe chiamare il numero di volte costruttore e poi il modificatore come vorrei (ci sono altre funzioni che non mutano, ma non voglio per renderlo più complessa per la domanda).
In alternativa, se questo non è Clojure idiomatico, come si dovrebbe fare qualcosa del genere?
eccellente, grazie. C'è un modo facile/idiomatico di mutare entrambi i vettori contemporaneamente, prima di tornare? –
o assoc-in: '(assoc-in pippo [: b 0] 12)' – Kevin
Assoc consente di eseguire più chiavi contemporaneamente, ad es. '(assoc foo: a [7 8 9]: b [3 4 5])'. Generalmente, se si desidera eseguire una qualsiasi mutazione più complessa/complessa, è opportuno includerla in una funzione separata (ben denominata). – mikera