如何检查一个值是否是一个承诺?

时间:2013-02-04 15:37:29

标签: clojure

有:

(def x (promise))

如何检查x的类型是否是承诺?

由于

2 个答案:

答案 0 :(得分:5)

我会说你一般不能。因为promise是作为多个界面的reify创建的:IDerefIBlockingDerefIPendingIFn。但您可以检查值是否实现其中一个:clojure.lang.IPending

(defn promise? [v]
  (instance? clojure.lang.IPending p))

或者甚至可能全部:

(defn promise? [v]
  (every? #(instance? % v) 
         [clojure.lang.IPending 
          clojure.lang.IFn 
          clojure.lang.IBlockingDeref 
          clojure.lang.IDeref]))

答案 1 :(得分:2)

我会去

(defn promise? [p]
  (isa? (class p) clojure.lang.IPending))