2017-03-06 7 views
2
(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 
+0

ソースを決して読まないでください。 ;)ドキュメントを読むだけです(下記参照)。 –

+0

@AlanThompsonの削除。私はバスの乗り継ぎ中に何かを考えようとしました。明らかにそれはうまくいかなかった。そして、私はコアソースを読むのが好きです!そこには興味深いものがたくさんありますが、その多くはかなり難読化されています。 – Carcigenicate

答えて

4

The docs for 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 
+0

'(condp = c'はもっと簡潔ですが、 – fl00r

1

ケース句の左辺のため未評価試験定数を使用します。 chan1のようなプレーン記号は、その名前のローカルバインディングの値ではなく、同じ名前のシンボルと一致します。 chan1は一致します'chan1

関連する問題