gpt4 book ai didi

clojurescript - 如何获取 ClojureScript 命名空间中的公共(public)函数列表?

转载 作者:行者123 更新时间:2023-12-05 04:10:22 25 4
gpt4 key购买 nike

我想从另一个命名空间获取公共(public)函数列表,以便它们可以作为命令公开。

A similar question for Clojure 似乎很接近,但似乎不适用于 ClojureScript。

Another question有 Clojurescript 的答案,但它们要么只显示如何将它们打印到 REPL,要么返回所有成员,而不仅仅是公开暴露的成员。

最佳答案

ClojureScript 没有 resolve 函数。可以使用 hack 来模仿行为,例如 this one :

(defn ->js [var-name]
(-> var-name
(clojure.string/replace #"/" ".")
(clojure.string/replace #"-" "_")))

(defn invoke [function-name & args]
(let [f (js/eval (->js function-name))]
(apply f args)))

您链接的第二个问题的答案是指打印的 clojure.repl/dir 函数

a sorted directory of public vars in a namespace.

如果你可以打印它们,你可以用 with-out-str 把它们变成一个字符串。

现在假设我们有一个名为 demo.core 的命名空间,其中有一个名为 add 的公共(public)函数:

(ns demo.core)

(defn add [a b]
(println "hello from add")
(+ a b))

我们可以从 demo.core 中检索公共(public) fns 作为字符串,如下所示:

(defn public-fns
"Returns coll of names of public fns in demo.core"
[]
(as-> (with-out-str (clojure.repl/dir demo.core)) public-fns
(clojure.string/split public-fns #"\n")
(map (fn [s] (str "demo.core/" s)) public-fns)))

因此,使用 with-out-str,我们将它们变成一个字符串列表,然后在换行符处拆分,然后在公共(public)函数的名称前加上“demo.core”。

然后,使用我们之前创建的 invoke 函数,我们可以获得 add 并使用参数 1 和 2 调用它:

(invoke (first (public-fns)) 1 2)
;; "hello from add"
;; => 3

这一切都非常 hacky,它可能会在高级编译中中断,但它确实有效。

关于clojurescript - 如何获取 ClojureScript 命名空间中的公共(public)函数列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44657162/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com