Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 封闭世界、基于价值的调度是case还是defmulti?_Clojure_Coding Style_Dispatch - Fatal编程技术网

Clojure 封闭世界、基于价值的调度是case还是defmulti?

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

假设我有一个有效调度密钥的封闭世界;在我的具体例子中,这是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-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
    中定义每个分支的能力是很方便的)等等