ClojureScript - 在地图中存储函数

时间:2015-09-02 21:51:41

标签: clojure clojurescript idiomatic

我使用地图存储函数调用(在ClojureScript中,但在Clojure中应该是相同的):

(def parse-fn {:json    js/JSON.parse
               :edn     read-string
               :transit t->clj})

然后我有一个transform函数,如下所示:

(defn transform [format data]
  ((get parse-fn format) data))

像这样调用transform(transform :transit data)效果很好。我只担心transform函数的可读性。第一件事是功能并不是显而易见的。

修改:我不能只是致电(:transit parse-fn),因为format来自其他功能,例如:(another-fn [... format ...] ... (transform format data))

是否有明确的call函数,或者此代码的结构不是惯用的?

2 个答案:

答案 0 :(得分:1)

也许考虑将关键字视为函数。

((:transit parse-fn) data)

对我而言,更简洁的方法可以帮助我将第一个元素识别为不同。

或者,您可以将地图视为功能。

((parse-fn :transit) data)

据我了解,第一种方法通常被认为更具惯用性,也可以be optimized more intelligently

答案 1 :(得分:1)

您的初始设计完全可读。将函数传递给执行实际工作的其他函数是一种非常正常的处理方式。我认为你不需要改变任何东西来“让它更具可读性”。如果我要更改任何内容以使我更加明确地将拼写的名称更改为transform-lookup或get-transform

(another-fn [... format ...] ... (transform-lookup format data))

(another-fn [... format ...] ... (get-transform format data))

虽然这是一个非常小的区别,它的方式很好。