ClojureScript - 在地图中存储函数

ClojureScript - store functions in map

我正在使用映射来存储函数调用(在 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 函数,或者这段代码的结构是否不符合惯例?

也许可以考虑将关键字作为函数处理。

((:transit parse-fn) data)

对我来说,更简洁的方法有助于我将第一个元素识别为不同的。

或者,您可以将映射视为函数。

((parse-fn :transit) data)

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

您的初始设计完全可读。将函数传递给执行实际工作的其他函数是一种相当正常的做事方式。我认为您不需要将任何内容更改为 "make it more readable"。如果我要更改任何内容以使我更清晰地表达出来,那就是将 transform 的名称更改为 transform-lookup 或 get-transform

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

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

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