Clojure 封闭世界、基于价值的调度是case还是defmulti?
假设我有一个有效调度密钥的封闭世界;在我的具体例子中,这是Nybles的类型。有两种明显的方法可以定义某些参数的操作,这些参数的行为基于nybble参数而有所不同:Clojure 封闭世界、基于价值的调度是case还是defmulti?,clojure,coding-style,dispatch,Clojure,Coding Style,Dispatch,假设我有一个有效调度密钥的封闭世界;在我的具体例子中,这是Nybles的类型。有两种明显的方法可以定义某些参数的操作,这些参数的行为基于nybble参数而有所不同: 使用案例,例如: (defn read-arg [arg-mode mem cursor] (case arg-mode 0x0 [:imm 0] 0x1 [:imm (read-fwd peek-word8 mem cursor)] ;; And so on 0xf [:ram (read-fw
案例
,例如:
(defn read-arg [arg-mode mem cursor]
(case arg-mode
0x0 [:imm 0]
0x1 [:imm (read-fwd peek-word8 mem cursor)]
;; And so on
0xf [:ram (read-fwd peek-word32 mem cursor)]))
defmulti
/defmethod
:
(defmulti read-arg (fn [arg-mode mem cursor] arg-mode))
(defmethod read-arg 0x0 [_ mem cursor] [:imm 0])
(defmethod read-arg 0x1 [_ mem cursor] [:imm (read-fwd peek-word8 mem cursor)])
;; And so on
(defmethod read-arg 0xf [_ mem cursor] [:ram (read-fwd peek-word32 mem cursor)])
对于Clojure,哪一种被认为是更好的风格?如果使用符号而不是Nybles进行调度,答案会有所不同吗?我希望在这种情况下,使用
case
调度本身会快得多,从而使任何风格方面的考虑变得毫无意义–基于窄范围内整数值的调度是case
的最佳情况,真的–然后我真的认为case
也是更好的样式(这看起来确实像封闭世界调度,所以最好使用一种机制来发出信号)
作为进一步的评论,似乎案例
中的“结果表达式”在这里会相当短,这很好。如果不是,那么将它们分解到它们自己的函数中可能是值得的,以防止执行分派的方法变得太大。(然后JIT将能够内联它找到的值得内联的部分。)
至于如果涉及到符号,我是否会有不同的感觉,这取决于许多因素——性能(这重要吗?在基准测试中是否有很大的差异?),分支的数量和大小(出于性能和可读性的考虑,保持总体方法大小较小是很好的,因此在单独的defmethod
中定义每个分支的能力是很方便的)等等