请解释lisp';s多值绑定

请解释lisp';s多值绑定,lisp,common-lisp,multiple-value,Lisp,Common Lisp,Multiple Value,我已经阅读了这些文档(几个不同的版本!),但我不能完全理解多值绑定 以下是我(认为我)知道的: 第一个参数是要绑定的变量列表 下一个参数是绑定到变量的值列表。 这两个列表的长度必须相同,对吗 最后一个参数(是可选的吗?)是一个代码体,它可以对具有新绑定值的变量进行操作 这似乎就是文档的阅读方式,它符合我正在阅读但不完全理解的代码。当我尝试从头开始创建一个多值bind语句作为测试时,我遇到了麻烦。我最终得到的结果如下: ? (mulitple-value-bind (x y z) (val

我已经阅读了这些文档(几个不同的版本!),但我不能完全理解
多值绑定

以下是我(认为我)知道的:

  • 第一个参数是要绑定的变量列表
  • 下一个参数是绑定到变量的值列表。
    • 这两个列表的长度必须相同,对吗
  • 最后一个参数(是可选的吗?)是一个代码体,它可以对具有新绑定值的变量进行操作
这似乎就是文档的阅读方式,它符合我正在阅读但不完全理解的代码。当我尝试从头开始创建一个
多值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 > 
(multiple-value-bind
    (q r)
    (floor n m)
    (cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
  body)
(我有点希望按照
66
的思路进行输出)(如果重要的话,我会使用Clozure CL,尽管我认为不应该)

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

? (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 > 
(multiple-value-bind
    (q r)
    (floor n m)
    (cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
  body)
(注意:我可能缩进错误,这可能会影响我的理解能力)

我不明白的是,在我看来,好像有两个变量被乘法绑定(q&r),但只有一个值
(floor n m)
。或者另一个值是
cons
语句,并且没有主体

正如您所看到的,我完全没有得到
多值绑定
;请开导我


谢谢

第一个使用“unbound variable”的示例是由于拼写错误造成的
多值绑定
。尝试修正拼写;你应该会看到不同的结果

关于第二个问题,
floor
返回两个值,floor和余数。请记住,
values
不是唯一返回多个值的函数


因此,
多值绑定
表单基本上如下所示:

? (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 > 
(multiple-value-bind
    (q r)
    (floor n m)
    (cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
  body)

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

Aha!果然,修正了打字错误。所以也许我比我想象的更了解m-v-b!谢谢克里斯指出我原稿中的错字。我将把它留在这里,因为否则这个问题就没有多大意义了(原来我理解得比我想象的好;我就是不会打字!:)很好的解释,谢谢!