2012-02-27 14 views
5

是否有可能檢查Clojure中是否有部分功能?如何檢查函數是否是局部的?

最好是有類似(partial? (partial + 10))

在此先感謝

+2

只是好奇:你爲什麼需要那個? – viebel 2012-02-27 12:38:40

+1

@Yehonathan我在Clojure中實現了沉,我需要區分正常函數和部分函數。 (由於設計決定)。 – 2012-02-27 13:40:07

+0

什麼是沉?另外,通過'#()'創建的匿名函數呢? – viebel 2012-02-27 14:25:31

回答

16

沒有,因爲部分創建函數只是「正常」的功能。 你可以使用,無論一些元數據,就像這樣:

(defn partial2 [f & more] 
    (with-meta (apply partial f more) {:partial true})) 

(def partial-plus (partial2 + 1 2)) 

(meta partial-plus) ;;=> {:partial true} 

沒有經歷過這種方法雖然後果還真以爲......

Kotarak想出了一個可行的好很多,但不總是。用串/分割爲分割功能

(defn partial? [f] 
    (let [[fst snd] (-> (class f) (.getName) (string/split #"\$"))] 
    (= ["clojure.core" "partial"] [fst snd]))) 

從clojure.string(1.3)或clojure.contrib.str-utils2(1.2):例如藉此:

(partial? (partial + 1)) ;;=> true 
(partial? (partial + 1 2)) ;;=> false 

這工作。

+0

clojure.string也在1.2中。 – 2012-02-27 13:50:14

+0

你也許應該測試'clojure.core',而不是'partial'。 – kotarak 2012-02-27 14:32:52

+0

好點,固定它。 – 2012-02-27 14:44:30

2

部分創建的函數只是普通的函數,但是如果你對它感興趣,也許這樣可能會有所幫助? :

(defn partial? 
    [f] 
    (clojure.contrib.string/substring? "partial" (str (class f)))) 

聲明:我不知道這樣的事情是不是傻瓜。

5

你可以用黑客。

user=> (let [partial-classes (map class [(partial + 1) 
             (partial + 1 2) 
             (partial + 1 2 3) 
             (partial + 1 2 3 4)])] 
     (defn partial? 
      [x] 
      (some #(instance? % x) partial-classes))) 
#'user/partial? 
user=> (partial? (partial - 1)) 
true 
user=> (partial? (partial - 1 2)) 
true 
user=> (partial? (partial - 1 2 3)) 
true 
user=> (partial? (apply partial - 1 2 [3 4 5])) 
true 

編輯:根據米歇爾的評論固定。你必須知道內部的partial證實了哈克的本性。