我想從另一個命名空間獲取公共函數的列表,以便它們可以作爲命令公開。如何獲取ClojureScript命名空間中的公共函數列表?
對於Clojure A similar question似乎很接近,但似乎並沒有在ClojureScript上工作。
Another question已經爲Clojurescript提供了答案,但是它們或者只是顯示如何將它們打印到REPL,或者返回所有成員而不是僅公開提供的成員。
我想從另一個命名空間獲取公共函數的列表,以便它們可以作爲命令公開。如何獲取ClojureScript命名空間中的公共函數列表?
對於Clojure A similar question似乎很接近,但似乎並沒有在ClojureScript上工作。
Another question已經爲Clojurescript提供了答案,但是它們或者只是顯示如何將它們打印到REPL,或者返回所有成員而不是僅公開提供的成員。
ClojureScript沒有resolve
函數。它可以模仿使用黑客的行爲,例如,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
功能,打印
公共瓦爾的排序目錄中的答案一個名字空間。
如果你可以打印它們,你可以把它們變成一個字符串with-out-str
。
現在讓我們假設我們有一個叫做demo.core
命名空間中的一個公共函數調用add
:
(ns demo.core)
(defn add [a b]
(println "hello from add")
(+ a b))
我們可以從demo.core
獲取公開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
所以我們將它們變成一個字符串列表,然後在換行符上分割,然後在「demo.core」前加上公用函數的名稱。
然後,用我們前面創建invoke
功能,我們可以得到add
並與參數1和2調用它:
(invoke (first (public-fns)) 1 2)
;; "hello from add"
;; => 3
這是非常哈克,它可能在高級編譯打破,但它作品。
它看起來像'clojure.repl/dir'打印名字空間中的公共變量。你會如何進一步濾除功能? – shader
看看['cljs.test/function?']的代碼(https://github.com/clojure/clojurescript/blob/r1.9.671-52-g3e775a1/src/main/cljs/cljs/test .cljc#L19-L23)和['cljs.analyzer/named-public-vars'](https://github.com/clojure/clojurescript/blob/d2711a2f222e56bdfa698610a59167de4124789d/src/main/clojure/cljs/repl.cljc# L1222)。也許這會幫助你。我現在無法讓它工作。 –