2015-11-22 52 views
1

比方說,我有以下幾點:的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不關閉我的功能了。應該怎麼做?

回答

2

重寫:

(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參數未使用。

1

剛纔也提到了這一點,您可能不想關閉也想考慮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)) 

然後:

0

你也可以使用部分

(defn my-fn [params] 
    (make-things (partial my.ns/a-fn params))) 
相關問題