为什么(condp包含?(:symbols xx):a(prn“ yes”))给出包含?类型不支持:clojure.lang.Keyword错误?

时间:2019-03-28 17:58:32

标签: clojure

我想用condp解决问题。

这就是我要使用condp检查的内容。

(def xx {:symbols {:a 1}})

(contains? (:symbols xx) :a)

true

但我收到此错误

(condp contains? (:symbols xx) :a (prn "yes"))

IllegalArgumentException contains? not supported on type:     
clojure.lang.Keyword  clojure.lang.RT.contains

1 个答案:

答案 0 :(得分:2)

这是由于参数condp传递给contains?的顺序的原因-它将关键字作为第一个参数传递。如果您创建一个交换参数顺序的匿名函数,它将执行您想要的操作:

user=> (def xx {:symbols #{:a :b}})
user=> (condp #(contains? %2 %1) (:symbols xx) :a (prn "yes"))
"yes"
nil

这是condp文档字符串中的相关行,解释了该参数顺序的行为:

  

对于每个子句,都会评估(pred test-expr expr)。