比方說,我有以下幾點:的Clojure - 關閉了一個函數在另一個命名空間
(defn my-fn [params]
(make-things (a-fn [ctx]
(do-this params)))
現在我想這個分裂成不同的文件,使得-FN是另一個命名空間:
(defn my-fn [params]
(make-things my.ns/a-fn))
但現在的問題是,params
不關閉我的功能了。應該怎麼做?
比方說,我有以下幾點:的Clojure - 關閉了一個函數在另一個命名空間
(defn my-fn [params]
(make-things (a-fn [ctx]
(do-this params)))
現在我想這個分裂成不同的文件,使得-FN是另一個命名空間:
(defn my-fn [params]
(make-things my.ns/a-fn))
但現在的問題是,params
不關閉我的功能了。應該怎麼做?
重寫:
(defn my-fn [params]
(make-things (fn a-fn [ctx]
(do-this params)))
到
(defn my-fn [params]
(make-things ((fn a-fn-o [p]
(fn a-fn [ctx]
(do-this p)))
params)))
這是編譯器做什麼你,當你關閉了變數。
然後,應該清楚在其他文件中做什麼。該函數返回一個功能,你在params
傳:
(defn my-fn [params]
(make-things (my.ns/a-fn params)))
;; my.ns
(defn a-fn [params]
(fn [ctx] (do-this params)))
順便說一句,你ctx
參數未使用。
剛纔也提到了這一點,您可能不想關閉也想考慮using a Var to scope the params dynamically rather than lexically。如果它們是my.ns
中的幾個相關函數的「隱含參數」,這將特別有用。
(ns my.ns)
(def ^:dynamic *params* ...) ;;Optional default value here
(defn a-fn [...]
(do-this *params* ...))
,然後在調用NS
(defn my-fn [params]
(binding [my.ns/*params* params]
(my.ns/a-fn ...)))
這是多麼例如with-out-str
改變無論是在它的身體和subcomputations任何print
變種的行爲 - 通過重新綁定*out*
爲空字符串的作家。在調用上下文
(ns my.ns)
(defn a-fn [params ctx]
(do-this params))
然後:
你也可以使用部分
(defn my-fn [params]
(make-things (partial my.ns/a-fn params)))