Clojure中的嵌套部分

时间:2015-07-14 03:08:58

标签: clojure

如何使用以下嵌套partial评估数据结构:((partial (partial - 3)6)9)。内部partial产生-3,然后我们有((partial -3)9)。 但是为什么部分为什么会产生(-3 - 9)?它从何处获得减法指令?

我想对Clojure读取和评估此数据表示的方式有所帮助。

1 个答案:

答案 0 :(得分:10)

在评估此表达式的过程中调用((partial - 3) 6)的说法不正确,这是误解的核心。

为了简化这一点,让我们分解一下:

((partial (partial - 3) 6) 9)

...而是将其重写为:

(let [p1 (partial - 3)]
  ((partial p1 6) 9)

现在,(partial p1 6)会返回什么?调用p1的函数,其第一个参数为6,并附加任何后续参数。因此,我们可以再次更详细地写出:

(let [p1 (partial - 3)
      p2 (partial p1 6)]
  (p2 9)

因此,(p2 9)调用(p1 6 9),调用(- 3 6 9)。永远不会在执行过程中的任何地方调用(- 3 6),因此在最终调用所有参数之前,-的初始函数调用永远不会消耗。

(实际实现可以优化中间调用,将p1的参数折叠为p2,但不需要将这些优化合并到概念模型中;行为等同于上面的内容。)