Mi chiedo se mi manca qualcosa di base che coinvolge la manipolazione del vettore. Diciamo che ho il seguente:Come si modifica una porzione di un vettore in Clojure?
(def xs [9 10 11 12 13])
(def idx [0 2])
(def values [1 3])
Se voglio tornare il vettore [1 10 3 12 13]
in Matlab, vorrei scrivere xs(idx) = values
. In Clojure, c'è un modo primitivo per raggiungere questo? In questo momento sto usando la seguente funzione:
(defn xinto [seq idx val]
(apply assoc seq (interleave idx val)))
Grazie.
Non posso offrire alcun codice oltre ai suggerimenti già forniti. 'assoc' _è_ la primitiva appropriata ma vuole che gli indici e i valori siano passati individualmente come si vede già. Puoi costruire una sequenza di coppie di valori di indice come fai tu e usare 'apply' o ricorsivamente associare usando' reduce' come suggerito da amalloy e mikera. Sotto il cofano la versione multi-indice del socio è ricorsiva comunque. Considero le opzioni 'reduce' più idiomatiche. –
Penso che la tua soluzione sia praticamente la migliore. –
'apply assoc' e' interleave' sono probabilmente la scelta migliore quando tutto ciò che si vuole fare è impostare in modo specifico un indice senza riguardo al suo valore precedente. La maggior parte delle volte sospetto che vorrete fare qualcosa di più complicato, e quindi questo "trucco" non funzionerà affatto; è per questo che ho suggerito di usare 'reduce', che è più generale. – amalloy