2013-02-04 43 views
3

有:如何檢查一個值是否爲承諾?

(def x (promise)) 

我如何檢查x的類型是一個承諾?

感謝

+2

不能UTIL你創建了有一些信息告訴它是否承諾或不 – Ankur

+0

@Ankur會'承諾另一個抽象(DEFN答應麼? [x](pos?(.indexOf(str(type x))「clojure.core $ promise」)))'是可笑的? –

+0

@ A.Webb這不會是一件大事:除了需要一個小小的修補程序才能工作,我希望你的代碼能夠通過這樣的方式來表達這樣的話:「這是你在這裏的一個非常好的功能,它會是一個恥辱如果有事情發生,就發生。「然後下一個版本的Clojure會改變你所依賴的實現細節。 – amalloy

回答

5

我說你不能籠統。因爲許諾創建爲reify的幾個接口:IDerefIBlockingDeref,IPending,IFn。但是你可以檢查價值是否實現其中的一個: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])) 
+0

與前者一樣,(promise?(filter even?[1 2 3]))=> true,所以我肯定會使用後者。 – Jeb

2

我會去與

(defn promise? [p] 
    (isa? (class p) clojure.lang.IPending)) 
相關問題