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

res*_*efm 3 clojure

有:

(def x (promise))
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Nik*_*zov 5

我会说你不能一般.由于承诺创建为reify下面几个接口:IDeref,IBlockingDeref,IPending,IFn.但是你可以检查值是否实现了其中一个:clojure.lang.IPending.

(defn promise? [v]
  (instance? clojure.lang.IPending p))
Run Code Online (Sandbox Code Playgroud)

或者甚至可能全部:

(defn promise? [v]
  (every? #(instance? % v) 
         [clojure.lang.IPending 
          clojure.lang.IFn 
          clojure.lang.IBlockingDeref 
          clojure.lang.IDeref]))
Run Code Online (Sandbox Code Playgroud)