Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 在成龙身上是否正确定义了平等?_Clojure_Core.async - Fatal编程技术网

Clojure 在成龙身上是否正确定义了平等?

Clojure 在成龙身上是否正确定义了平等?,clojure,core.async,Clojure,Core.async,我想维护一个频道集合,能够添加和删除频道。是否定义了相等,以便我能正确地conj和disj 换句话说,这个是否总是有效 => (def chan-collection (atom #{})) => (def my-chan-1 (chan)) => (def my-chan-2 (chan)) => @chan-collection #{} => (swap! chan-collection conj my-chan-1) => @chan-collectio

我想维护一个频道集合,能够添加和删除频道。是否定义了相等,以便我能正确地
conj
disj

换句话说,这个是否总是有效

=> (def chan-collection (atom #{}))
=> (def my-chan-1 (chan))
=> (def my-chan-2 (chan))
=> @chan-collection
#{}
=> (swap! chan-collection conj my-chan-1)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@6ec3a2f6>}
=> (swap! chan-collection conj my-chan-2)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@382830a1>
  #<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@6ec3a2f6>}
=> (swap! chan-collection disj my-chan-1)
=> @chan-collection
#{#<ManyToManyChannel clojure.core.async.impl.channels.ManyToManyChannel@382830a1>}
=> (swap! chan-collection disj my-chan-2)
=> @chan-collection
#{}
=>(def chan集合(atom{}))
=>(def my-chan-1(chan))
=>(def my-chan-2(chan))
=>@chan系列
#{}
=>(交换!chan collection conj my-chan-1)
=>@chan系列
#{#}
=>(交换!chan collection conj my-chan-2)
=>@chan系列
#{#
#}
=>(交换!成龙系列disj my-chan-1)
=>@chan系列
#{#}
=>(交换!成龙系列disj my-chan-2)
=>@chan系列
#{}

是的,这是真的,改变它会破坏一切

如果通道是同一个对象,则通道是相同的,因此在所有情况下都是相同的。Chan的所有其他比较都明显不相等,这对你有好处。您希望删除的是您要求删除的确切chan,而不是具有相同内容的等效chan。所以幸运的是,不相同的通道也不相等

在一般的“Clojure世界”中,相同的属性适用于所有属于身份而非价值的事物。身份具有随时间而变化的价值,因此,如果在您询问时,两个身份碰巧包含相同的价值,那么说它们相等是没有意义的,即使这可能只适用于您,而不适用于其他任何人。比较身份中的值更有意义。例如,像chans一样,具有相同值的原子也不相等,这是clojure永远不会改变的基本属性

user> (let [a (atom 1)]
        (= a a))
true
user> (= (atom 1) (atom 1))
false
如果你想删除它们,就像你在上面做的那样,把你想要删除的确切的chan作为disj的参数,而不是像“删除42个频道”这样的其他概念

如果我们执行相同的设置:

user> (require '[clojure.core.async :refer [<! <!! >! chan]])
nil
user> (def chan-collection (atom #{}))
#'user/chan-collection
user> (def my-chan-1 (chan))
#'user/my-chan-1
user> (def my-chan-2 (chan))
#'user/my-chan-2
user> (swap! chan-collection conj my-chan-1 my-chan-2)
 #{#object[clojure.core.async.impl.channels.ManyToManyChannel 0x35b61c71 "clojure.core.async.impl.channels.ManyToManyChannel@35b61c71"] #object[clojure.core.async.impl.channels.ManyToManyChannel 0x240e86d5 "clojure.core.async.impl.channels.ManyToManyChannel@240e86d5"]}

我们可以验证它不起任何作用。

您没有显示它正在工作吗?我正在显示它今天在我的机器上工作。我的问题是,它被指定工作吗?我不确定你的编辑是完全必要的,raam86。只有一句话的意思很清楚!我想这就是白痴的证明。我之前没有看到它。我没有理由假设
chan
的相等语义。集合的比较基于其内容,而不是其引用相等性
chan
不是一个集合,但它是类似的。你可以说两个空的
chan
s应该是
=
,但不是
相同?
。虽然这个例子是可行的,但没有理由认为应该这样做。
user> (require '[clojure.core.async :refer [<! <!! >! chan]])
nil
user> (def chan-collection (atom #{}))
#'user/chan-collection
user> (def my-chan-1 (chan))
#'user/my-chan-1
user> (def my-chan-2 (chan))
#'user/my-chan-2
user> (swap! chan-collection conj my-chan-1 my-chan-2)
 #{#object[clojure.core.async.impl.channels.ManyToManyChannel 0x35b61c71 "clojure.core.async.impl.channels.ManyToManyChannel@35b61c71"] #object[clojure.core.async.impl.channels.ManyToManyChannel 0x240e86d5 "clojure.core.async.impl.channels.ManyToManyChannel@240e86d5"]}
user> (swap! chan-collection disj (chan))
 #{#object[clojure.core.async.impl.channels.ManyToManyChannel 0x35b61c71 "clojure.core.async.impl.channels.ManyToManyChannel@35b61c71"] #object[clojure.core.async.impl.channels.ManyToManyChannel 0x240e86d5 "clojure.core.async.impl.channels.ManyToManyChannel@240e86d5"]}