Pregunta
¿Cuál es la forma más sencilla de crear un vector de referencias distintas?
Usar (repetir 5 (ref nil))
devolverá una lista, pero todos harán referencia a la misma referencia:
user=> (repeat 5 (ref nil))
(#<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<R
ef@16ef71: nil>)
Mismo resultado con (replicate 5 (ref nil))
:
user=> (replicate 5 (ref nil))
(#<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil>
#<Ref@1d88db7: nil>)
Solución
user> (doc repeatedly)
-------------------------
clojure.core/repeatedly
([f])
Takes a function of no args, presumably with side effects, and returns an infinite
lazy sequence of calls to it
nil
user> (take 5 (repeatedly #(ref nil)))
(#<Ref@1f10a67: nil> #<Ref@1e2161d: nil> #<Ref@1a034d: nil> #<Ref@1cee792: nil> #<Ref@c5577c: nil>)
us
Otros consejos
Ok, esto es bastante asqueroso, pero funciona:
user=> (map (fn [_] (ref nil)) (range 5))
(#<Ref@27147d: nil> #<Ref@b248c8: nil> #<Ref@c86116: nil> #<Ref@5e06ef: nil> #<Ref@19719f: nil>)
Eso devuelve un LazySeq, por lo que si desea / necesita un Vector, simplemente use:
user=> (vec (map (fn [_] (ref nil)) (range 5)))
[#<Ref@5bf9cf: nil> #<Ref@6dbfb0: nil> #<Ref@43f787: nil> #<Ref@2fe9bf: nil> #<Ref@9b1e15: nil>]
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow