Search code examples
clojurepartialcurrying

How can I check if function is a partial?


Is there a possibility to check if something is a partial function in Clojure?

It would be best to have something like (partial? (partial + 10)) ?

Thanks in advance


Solution

  • No, because functions created by partial are just "normal" functions. You could however use some metadata for it, like this:

    (defn partial2 [f & more]
      (with-meta (apply partial f more) {:partial true}))
    
    (def partial-plus (partial2 + 1 2))
    
    (meta partial-plus) ;;=> {:partial true}
    

    Haven't really thought through the consequences of this approach though...

    Kotarak came up with a nicer solution that works, but not always. For example take this:

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

    This works:

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

    with string/split being the split function from clojure.string (1.3) or clojure.contrib.str-utils2 (1.2).