Clojure:判断函数是否存在

发布于 2024-12-09 11:31:34 字数 136 浏览 0 评论 0原文

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

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

谢谢

how can i know if a function name provided as string is callable or not in the current context? something like:

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

thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

萌逼全场 2024-12-16 11:31:34

您正在寻找resolve,

(resolve (symbol "asd"))

返回nil

(resolve (symbol "filter"))

return #'clojure.core/filter

要检查var是否是一个函数(归功于@amalloy):

(-> s symbol resolve deref ifn?)

You are looking for resolve,

(resolve (symbol "asd"))

returns nil

(resolve (symbol "filter"))

return #'clojure.core/filter

To check if a var is a function (credit goes to @amalloy):

(-> s symbol resolve deref ifn?)
乖乖哒 2024-12-16 11:31:34

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

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

Chances are if you need this, you're doing something wrong, but...

(defn callable? 
  [s] 
  (let [obj (try (eval (symbol s)) (catch Exception e))]
  (and obj (fn? obj))))
任谁 2024-12-16 11:31:34
(defn callable? [name]      
   (clojure.test/function? (symbol name)))

UPD。我发现fn?仅检查接口Fn并且不适用于已解析的符号。不过, clojure.test/function? 可以满足需要,所以我更新了一个示例。

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

UPD. I found out that fn? checks only for interface Fn and doesn't work for resolved symbol. Though, clojure.test/function? does what is needed, so I updated an example.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文