是否有可能在Clojure中检查某些东西是否是部分功能?
最好有类似(partial? (partial + 10))
的内容?
提前致谢
答案 0 :(得分:16)
不,因为partial创建的函数只是“正常”函数。 但是,您可以使用一些元数据,如下所示:
(defn partial2 [f & more]
(with-meta (apply partial f more) {:partial true}))
(def partial-plus (partial2 + 1 2))
(meta partial-plus) ;;=> {:partial true}
虽然没有真正考虑过这种方法的后果......
Kotarak想出了一个更好的解决方案,但并非总能如此。比如说:
(partial? (partial + 1)) ;;=> true
(partial? (partial + 1 2)) ;;=> false
这有效:
(defn partial? [f]
(let [[fst snd] (-> (class f) (.getName) (string/split #"\$"))]
(= ["clojure.core" "partial"] [fst snd])))
string / split是clojure.string(1.3)或clojure.contrib.str-utils2(1.2)中的split函数。
答案 1 :(得分: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
编辑:根据Michiel的评论修正。你必须知道partial
的内脏确认了黑客的本性。
答案 2 :(得分:2)
由partial创建的函数只是普通的函数,但是如果你对它有所了解,也许这样的东西会有帮助吗? :
(defn partial?
[f]
(clojure.contrib.string/substring? "partial" (str (class f))))
免责声明:我不知道这样的事情是否是万无一失的。