3

有:

(def x (promise))

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

谢谢

4

2 回答 2

5

我会说你一般不能。因为 promise 是由reify几个接口创建的:IDeref, IBlockingDeref, IPending, IFn. 但是您可以检查 value 是否实现其中之一: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]))
于 2013-02-04T15:45:01.870 回答
2

我会去

(defn promise? [p]
  (isa? (class p) clojure.lang.IPending))
于 2013-02-04T15:44:45.780 回答