Clojure引用向量

5

如何创建一个包含不同引用的向量?最简单的方法是什么?

使用(repeat 5 (ref nil))会返回一个列表,但它们都将引用相同的引用:

user=> (repeat 5 (ref nil))
(#<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<Ref@16ef71: nil> #<R
ef@16ef71: nil>)

(replicate 5(ref nil))相同的结果:
user=> (replicate 5 (ref nil))
(#<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil> #<Ref@1d88db7: nil>
 #<Ref@1d88db7: nil>)
2个回答

8
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

1
然后将其包装在(vec (take 5 (repeatedly #(ref nil))))中。 - Arthur Ulfeldt

4

好的,这很恶心,但是它有效:

user=> (map (fn [_] (ref nil)) (range 5))
(#<Ref@27147d: nil> #<Ref@b248c8: nil> #<Ref@c86116: nil> #<Ref@5e06ef: nil> #<Ref@19719f: nil>)

这将返回一个LazySeq,如果您需要使用向量,则只需使用:

user=> (vec (map (fn [_] (ref nil)) (range 5)))
[#<Ref@5bf9cf: nil> #<Ref@6dbfb0: nil> #<Ref@43f787: nil> #<Ref@2fe9bf: nil> #<Ref@9b1e15: nil>]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接