Clojure:确定函数是否存在

时间:2011-10-10 16:25:42

标签: clojure lisp

我怎么知道作为字符串提供的函数名在当前上下文中是否可调用?类似的东西:

(callable? "asdasd") ;; false
(callable? "filter") ;; true

感谢

3 个答案:

答案 0 :(得分:17)

您正在寻求决心,

(resolve (symbol "asd"))

返回nil

(resolve (symbol "filter"))

返回#'clojure.core / filter

检查var是否为函数(信用转到@amalloy):

(-> s symbol resolve deref ifn?)

答案 1 :(得分:1)

如果你需要这个,你做错了什么,但是......

(defn callable? 
  [s] 
  (let [obj (try (eval (symbol s)) (catch Exception e))]
  (and obj (fn? obj))))

答案 2 :(得分:-1)

(defn callable? [name]      
   (clojure.test/function? (symbol name)))

UPD。我发现fn?仅检查接口Fn,但不适用于已解析的符号。虽然,clojure.test/function?做了所需的事情,所以我更新了一个例子。