Common Lisp中do循环中的多个值绑定

ˆᵛˆ*_*ˆᵛˆ 3 common-lisp

如何在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)

或者也许有一种方法可以使用多值绑定来做到这一点?

ken*_*ton 8

怎么样?:

(loop for (x y z) = (multiple-value-list (3-val-fn))
 ...etc)
Run Code Online (Sandbox Code Playgroud)

我会提供更多,但无法理解 do-loop。


Rai*_*wig 6

实际上不支持标准迭代结构中的多个值.

使用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)

上面使用的优点是它不会在每次迭代期间从多个值创建列表.从多个值创建列表会破坏多个值的目的,这些值可以返回多个值并允许以有效的方式实现它.