关闭Clojure中函数的哈希映射

时间:2015-01-31 06:58:33

标签: clojure

我有一组函数都具有相同的第一个参数。

(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,但这看起来不是很好,很有用。是否有规范/惯用的方式来做到这一点?

2 个答案:

答案 0 :(得分:1)

让我们思考一下:您已经获得了一系列内容,并且您希望对每个内容应用一些内容,因此map。你想对他们申请什么?您想部分应用第一个参数,因此partial。然后,您希望对每个值都有唯一的引用,因此请在列表中使用解构。

添加所有内容,假设dirget-filewrite-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并且不是全局绑定变量。