Clojure - 关闭另一个命名空间中的函数

时间:2015-11-22 08:19:45

标签: clojure closures clojurescript

让我们说我有以下内容:

(defn my-fn [params]
  (make-things (a-fn [ctx]
                 (do-this params)))

现在我想把它拆分成不同的文件,这样a-fn就在另一个命名空间中:

(defn my-fn [params]
  (make-things my.ns/a-fn))

但现在的问题是params不再关闭我的功能了。应该怎么做?

3 个答案:

答案 0 :(得分: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 :(得分: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通过将print重新绑定到空字符串编写器来改变其正文和子计算中任何*out*变体的行为的方式。

答案 2 :(得分:0)

你也可以使用partial:

(ns my.ns)

(defn a-fn [params ctx]
  (do-this params))

然后在调用上下文中:

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