如何在do循环中绑定从函数返回的多个值?以下显然是非常错误的,但这可能是这样的吗?
(do (((x y z) (3-val-fn) (3-val-fn)))
((equal y 'some-val) y)
(values x y z))
Run Code Online (Sandbox Code Playgroud)
或者也许有一种方法可以使用多值绑定来做到这一点?
怎么样?:
(loop for (x y z) = (multiple-value-list (3-val-fn))
...etc)
Run Code Online (Sandbox Code Playgroud)
我会提供更多,但无法理解 do-loop。
实际上不支持标准迭代结构中的多个值.
使用LOOP,您的代码段可能如下所示:
(loop with x and y and z
do (setf (values x y z) (3-val-fn))
while (equal y 'some-val)
finally (return y)
do ...)
Run Code Online (Sandbox Code Playgroud)
如果我经常需要这样的东西,我可能会定义一个do-mv
扩展到上面代码的宏.然后代码看起来像:
(do-mv ((x y z) (3-val-fn))
((equal y 'some-val) y)
...)
Run Code Online (Sandbox Code Playgroud)
上面使用的优点是它不会在每次迭代期间从多个值创建列表.从多个值创建列表会破坏多个值的目的,这些值可以返回多个值并允许以有效的方式实现它.