并行绑定在Clojure中意味着什么

时间:2014-01-15 15:58:28

标签: clojure lisp

我看到recur的绑定是“并行”的,但是我不知道这意味着什么。

我测试了以下代码:

(defn parallelTest
  "parallel binding test of recur "
  []
  (loop [vectorA [1 2 3 4 5]
         A (first vectorA)]
    (if-not (= A nil)
      (do (println vectorA) (println A)
        (recur (rest vectorA) (first vectorA)))) ;Recur!
    ))
(parallelTest)

输出

user=> 
[1 2 3 4 5]
1
(2 3 4 5)
1
(3 4 5)
2
(4 5)
3
(5)
4
()
5
nil

所以我假设绑定发生了同时而不是一个接一个地发生?

2 个答案:

答案 0 :(得分:4)

是的,在计算机科学中,“并行”通常意味着同时,而不是“顺序”(按指定顺序)或“同时”(以任意不确定的顺序,可以与任意序列并行或顺序) )。并行绑定通常被理解为意味着一个绑定的结果(左侧)不在另一个绑定的创建(右侧)范围内(与顺序绑定相反,如Clojure的let语句中所示)。

答案 1 :(得分:3)

顺序绑定

a = 1
b = 2

下面

    评估
  1. 1
  2. 然后绑定到a
  3. 然后评估2
  4. 然后绑定到b
  5. 并行绑定

    a,b = 1,2
    

    下面,

    1. 12按照确定的顺序(例如从左到右)进行评估,具体取决于语言规范
    2. 这两个结果分别与ab绑定。
    3. 如果表达式(此处为12独立无副作用,那么哪个绑定无关紧要使用,但同时你需要知道确切的评估顺序。

      现在,在你的情况下,

      1. 首先(rest vectorA)
      2. 然后评估(first vectorA)(从左到右)
      3. 然后结果分别绑定到vectorAA
      4. 这是一个并行绑定,而不是像Clojure中的let绑定那样顺序绑定。