【问题标题】:Evaluation order of function arguments in ClojureClojure 中函数参数的求值顺序
【发布时间】:2011-01-27 10:50:26
【问题描述】:

Clojure 是否指定函数参数的求值顺序?

即当我在 Clojure 中调用函数时:

(my-func (fun1 arg1) (fun2 arg2) (fun3 arg3))

fun1fun2fun3 的求值顺序是否已定义?

我知道 Java 将函数参数的求值顺序定义为从左到右,但我可以想象像 Clojure 这样的函数式语言会更轻松。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    评估顺序是从左到右。见http://clojure.org/evaluation

    运算符和操作数 (如果有的话)被评估,从左到 对。

    【讨论】:

    • 从该链接有趣的是,((fun1 arg) (fun2 arg) (fun3 arg)) 将导致调用所有 funN 函数,然后将 (fun1 arg) 的结果转换为函数类型(它可能不是)。
    【解决方案2】:

    从左到右,但也由内向外 (fun1 (fun2 arg2))。

    我认为,一般来说,对于函数式语言,您会希望避免 (fun1 arg1) 影响 (fun2 arg2) 或 (fun3 arg3) 的情况。 (fun1 arg1) 理想情况下会返回一个值而不改变程序中现有数据结构的状态。

    因此,根据您与函数式编程风格的接近程度,从左到右的求值顺序并不重要。

    http://clojure.org/state

    【讨论】:

    • +1 表示如果你的程序是用良好的 FP 风格编写的,那没关系....
    【解决方案3】:

    (my-func (fun1 arg1) (fun2 arg2) (fun3 arg3))

    my-func 的元数为 3。 (fun1 arg1) 的结果将作为第一个参数传递给 my-func。等等然后my-func就会被执行。

    因此,my-func 参数的求值顺序根本不重要。

    如果您有副作用,那么,嗯,嗯...但是这个答案不会改变。顺序无关紧要。

    干杯-

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-25
      • 2019-10-10
      相关资源
      最近更新 更多