【发布时间】:2020-06-20 20:46:01
【问题描述】:
我正在研究这两个函数,它们的区别仅在于循环运行时 ret 和 curr 的赋值方式。在第一个函数中,ret 和 curr 并行绑定;在第二个函数中,它们是按顺序绑定的。
并行绑定
(defun maxpower (base maximum)
"returns base ^ k such that it is <= maximum"
(do ((ret 1 curr) ; parallel
(curr base (* base curr))) ; binding
((> curr maximum) ret)))
顺序绑定
(defun maxpower* (base maximum)
"returns base ^ k such that it is <= maximum"
(do* ((ret 1 curr) ; sequential
(curr base (* base curr))) ; binding
((> curr maximum) ret)))
问题:第一个函数是否在某种程度上错误 (*) 因为curr 被同时更新和评估(并行)?
IOW:如果我更改绑定的顺序,并行版本应该没有区别吗?
Lisp 如何决定绑定的并行化?
在我的测试中,两个函数都返回相同的值。
(*):我来自C背景;我会说第一个函数调用未定义的行为。
【问题讨论】:
标签: lisp common-lisp undefined-behavior