Me pregunto si me estoy perdiendo algo básico relacionado con la manipulación de vectores. Digamos que tengo el siguiente:¿Cómo modifico una porción de un vector en Clojure?
(def xs [9 10 11 12 13])
(def idx [0 2])
(def values [1 3])
Si quiero devolver el vector [1 10 3 12 13]
en Matlab, me gustaría escribir xs(idx) = values
. En Clojure, ¿hay alguna forma primitiva de lograr esto? En este momento estoy usando la siguiente función:
(defn xinto [seq idx val]
(apply assoc seq (interleave idx val)))
Gracias.
No puedo ofrecer ningún código más allá de las sugerencias ya dadas. 'assoc' _es_ la primitiva apropiada pero quiere que los índices y valores pasen individualmente como ya se ve. Puedes construir una secuencia de pares de valores de índice como lo haces y usar 'apply' o recurrentemente hacer la asociación usando' reduce' como lo sugieren amalloy y mikera. Bajo el capó, la versión multi-valor de Assoc es recursiva de todos modos. Consideraría las opciones 'reducir' más idiomáticas. –
Creo que su solución es bastante buena. –
'apply assoc' y' interleave' son probablemente la mejor opción cuando todo lo que desea hacer es establecer específicamente un índice sin tener en cuenta su valor anterior. La mayor parte del tiempo sospecho que querrás hacer algo más complicado, y entonces este "truco" no funcionará en absoluto; es por eso que sugerí usar 'reduce', que es más general. – amalloy