12
(defn is-member? [a lst] 
((cond 
        (empty? lst) false
        (= a (first lst)) true
        :else (is-member? a (rest lst))
    )))

(is-member? :b '(:a :b :c))

上記のコードを実行すると、エラーが発生します

ClassCastException java.lang.Boolean は clojure.lang.IFn user/is-member にキャストできませんか? (NO_SOURCE_FILE:28)

なんで?式が括弧で囲まれている場合、それは関数として評価されることを意味することを理解しています..

4

2 に答える 2

18

二重括弧内に cond 式があります。これにより、cond の最終結果 (true または false) が関数として呼び出されます。それを修正すると動作します。

=> (defn is-member?
     [a lst] 
     (cond 
       (empty? lst) false
       (= a (first lst)) true
       :else (is-member? a (rest lst))))
#'user/is-member?

=> (is-member? :b '(:a :b :c))
true

ちなみに、Clojure でこれを行う最も慣用的な方法は、some.

=> (some #{:b} [:a :b :c])
:b

これは実際の最初の値を返しますが、Clojure の真実性により、true や false とほぼ同じように条件で使用できます。

于 2013-01-28T09:49:30.503 に答える