让我们说我有以下内容:
(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
不再关闭我的功能了。应该怎么做?
答案 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)))