我看到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
所以我假设绑定发生了同时而不是一个接一个地发生?
答案 0 :(得分:4)
是的,在计算机科学中,“并行”通常意味着同时,而不是“顺序”(按指定顺序)或“同时”(以任意不确定的顺序,可以与任意序列并行或顺序) )。并行绑定通常被理解为意味着一个绑定的结果(左侧)不在另一个绑定的创建(右侧)范围内(与顺序绑定相反,如Clojure的let
语句中所示)。
答案 1 :(得分:3)
顺序绑定
a = 1
b = 2
下面
1
a
2
并行绑定
a,b = 1,2
下面,
1
和2
按照确定的顺序(例如从左到右)进行评估,具体取决于语言规范a
和b
绑定。如果表达式(此处为1
和2
)独立且无副作用,那么哪个绑定无关紧要使用,但同时你需要知道确切的评估顺序。
现在,在你的情况下,
(rest vectorA)
(first vectorA)
(从左到右)vectorA
和A
。这是一个并行绑定,而不是像Clojure中的let
绑定那样顺序绑定。