如何在do循环中绑定从函数返回的多个值?以下显然是非常错误的,但这可能是这样的吗?
(do (((x y z) (3-val-fn) (3-val-fn))) ((equal y 'some-val) y) (values x y z))
或者也许有一种方法可以使用多值绑定来做到这一点?
实际上不支持标准迭代结构中的多个值.
使用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 ...)
如果我经常需要这样的东西,我可能会定义一个do-mv
扩展到上面代码的宏.然后代码看起来像:
(do-mv ((x y z) (3-val-fn)) ((equal y 'some-val) y) ...)
上面使用的优点是它不会在每次迭代期间从多个值创建列表.从多个值创建列表会破坏多个值的目的,这些值可以返回多个值并允许以有效的方式实现它.