在``case''中使用频道


(let [a (clojure.core.async/chan)]
  (case a
    a :foo
    :bar))
#=> :bar

我希望在这里:foo。我在做什么错?

另一方面(condp = chan ...)完成工作。

ps:

基本上我正在尝试做以下操作:

(require '[clojure.core.async :as a])
(let [chan1 (a/chan 10)
      chan2 (a/chan 10)]
  (a/>!! chan1 true)
  (let [[v c] (a/alts!! [chan1 chan2])]
    (case c
      chan1 :chan1
      chan2 :chan2
      :niether)))
#=> :neither

case的文档有答案

未评估测试剂。他们必须是编译时间 文字,不必引用。

正确的解决方案是使用cond

(let [chan1 (ca/chan 10)
      chan2 (ca/chan 10)]
    (ca/>!! chan1 true)
    (let [[v c] (ca/alts!! [chan1 chan2])]
      (spyx (cond
              (= c chan1) :chan1
              (= c chan2) :chan2
              :else :neither))))
;=> :chan1

案例使用该子句的左侧未评估的测试组合。像chan1一样,普通的符号将仅与同名符号匹配,而不是该名称的本地绑定的值;chan1将匹配'chan1

最新更新