2017-06-20 55 views

回答

1

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 

這是非常哈克,它可能在高級編譯打破,但它作品。

+0

它看起來像'clojure.repl/dir'打印名字空間中的公共變量。你會如何進一步濾除功能? – shader

+1

看看['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)。也許這會幫助你。我現在無法讓它工作。 –