9

我已经阅读了文档(几个不同的版本!),但我无法完全理解multiple-value-bind

这是我(认为我)知道的:

  • 第一个参数是要绑定的变量列表。
  • 下一个参数是绑定到变量的值列表。
    • 我对这两个列表的长度必须相同吗?
  • 最后一个参数(它是可选的吗?)是一段代码,可以用它们的新绑定值作用于变量。

这似乎是文档的阅读方式,它符合我正在阅读但不完全遵循的代码。当我尝试multiple-value-bind从头开始创建语句作为测试时,我遇到了麻烦。我最终得到这样的结果:

? (mulitple-value-bind (x y z) (values 11 22 33) (+ x y z)) ;; EDIT: contains typo
> Error: Unbound variable: Y
> While executing: CCL::CHEAP-EVAL-IN-ENVIRONMENT, in process Listener(7).
> Type cmd-/ to continue, cmd-. to abort, cmd-\ for a list of available restarts.
> If continued: Retry getting the value of Y.
> Type :? for other options.
1 > 

(我有点希望输出66类似于.)(如果重要的话,我正在使用 Clozure-CL,尽管我认为它不应该。)

另外,我正在查看一些示例代码(试图理解 Project Euler Problem 24),内容如下:

(multiple-value-bind
    (q r)
    (floor n m)
    (cons (nth q lst) (permute-b r (remove-nth q lst)))
)

(注意:我可能有错误的缩进,这可能会影响我缺乏理解)

我对此不明白的是,在我看来,好像有 2 个变量被乘法绑定(q & r),但只有一个值(floor n m)。还是其他值是cons语句,没有body?!

如您所见,我完全不明白multiple-value-bind;请赐教。

谢谢!

4

1 回答 1

14

您的第一个带有“未绑定变量”的示例是由于您的拼写错误multiple-value-bind。尝试修正拼写;你应该会看到不同的结果。

至于你的第二个问题,floor返回两个值,下限和余数。请记住,这values不是唯一返回多个值的函数!


所以,基本上,multiple-value-bind表格看起来像这样:

(multiple-value-bind (var-1 .. var-n) expr
  body)

whereexpr是一个返回多个值的表达式,这些值绑定到 中给出的变量名var-1 .. var-n;这些变量可用于body. 可以expr返回比作为变量给出的更多或更少的值;nil用作任何缺失值的默认值,并丢弃任何多余的值。

于 2013-07-27T18:32:21.867 回答