【发布时间】:2011-10-10 16:25:41
【问题描述】:
我如何知道作为字符串提供的函数名在当前上下文中是否可调用?类似:
(callable? "asdasd") ;; false
(callable? "filter") ;; true
谢谢
【问题讨论】:
-
还要注意“可调用”这个词在这里被重载了。所有 Clojure 函数都是 java.util.concurrent.Callables。
我如何知道作为字符串提供的函数名在当前上下文中是否可调用?类似:
(callable? "asdasd") ;; false
(callable? "filter") ;; true
谢谢
【问题讨论】:
你正在寻找解决方案,
(resolve (symbol "asd"))
返回零
(resolve (symbol "filter"))
返回 #'clojure.core/filter
检查 var 是否为函数(感谢 @amalloy):
(-> s symbol resolve deref ifn?)
【讨论】:
(fn? (eval (symbol "filter"))) - resolve 返回类或 var,而不是带有 Fn 接口的东西(请参阅我的答案),因此将不起作用。
(when-let [f (resolve (symbol "filter"))] (and (var? f) (fn? @f)))
(-> s symbol resolve deref ifn?)。
如果你需要这个,你可能做错了什么,但是......
(defn callable?
[s]
(let [obj (try (eval (symbol s)) (catch Exception e))]
(and obj (fn? obj))))
【讨论】:
resolve 表示您可能做错了什么;使用eval 执行相同的任务肯定表明您做错了。
(defn callable? [name]
(clojure.test/function? (symbol name)))
UPD. 我发现fn? 只检查接口Fn,并且不适用于已解析的符号。不过,clojure.test/function? 做了需要做的事情,所以我更新了一个示例。
【讨论】: