我有一组函数都具有相同的第一个参数。
(defn get-file [dir filename] ...)
(defn write-file [dir filename] ...)
我想基本上同时部分地应用所有这些。好像我可以将它们全部包装在这样的函数中:
(defn get-fns [dir]
{:get-file (fn [filename] ...)
:write-file (fn [filename] ...)})
但是看起来像访问函数会有点烦人。
(let [fns (get-fns dir-name)]
((fns :get-file) filename)))
我想我也可以使用一个可变的var
,但这看起来不是很好,很有用。是否有规范/惯用的方式来做到这一点?
答案 0 :(得分:1)
让我们思考一下:您已经获得了一系列内容,并且您希望对每个内容应用一些内容,因此map
。你想对他们申请什么?您想部分应用第一个参数,因此partial
。然后,您希望对每个值都有唯一的引用,因此请在列表中使用解构。
添加所有内容,假设dir
,get-file
和write-file
都已定义,您可以
(let [[get-file-here write-file-here] (map #(partial % dir) [get-file write-file])]
...)
这是一个完整的例子
(let [[add-to-3 sub-from-3] (map #(partial % 3) [+ -])]
(prn (add-to-3 2)) ; 5
(prn (sub-from-3 5))) ; -2
答案 1 :(得分:1)
因此,我们需要一系列可以在本地绑定上下文中使用的部分应用程序。
(defn get-fns
[dir]
{:get-f (partial get-file dir)
:write-f (partial write-file dir)})
然后,在本地绑定中,我们可以使用它们
(let [{:keys [get-f write-f]} (get-fns dir)]
(get-f file-name))
(您当然可以免费使用原始关键字,通过更改关键字,我明确指出get-f
来自get-fns
并且不是全局绑定变量。