请解释一下lisp的多值绑定

Oli*_*lie 7 lisp common-lisp multiple-value

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

这就是我(我想)知道的:

  • 第一个参数是要绑定的变量列表.
  • 下一个参数是绑定到变量的值列表.
    • 我是对的,这2个列表的长度必须相同吗?
  • 最后一个参数(可选吗?)是一个代码体,可以使用新绑定的值对变量进行操作.

这肯定是文档读取的方式,它适合我正在阅读的代码,但不是非常紧随其后.当我尝试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 > 
Run Code Online (Sandbox Code Playgroud)

(我有点希望输出符合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)))
)
Run Code Online (Sandbox Code Playgroud)

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

我没有得到的是它在我看来好像有2个变量是多重约束(q&r),但只有一个值(floor n m).或者是cons声明的另一个值,并且没有身体?!

如你所见,我完全没有得到multiple-value-bind; 请赐教.

谢谢!

Chr*_*ung 10

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

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


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

(multiple-value-bind (var-1 .. var-n) expr
  body)
Run Code Online (Sandbox Code Playgroud)

where expr是一个表达式,它返回多个值,这些值绑定到给定的变量名称var-1 .. var-n; 这些变量可供使用body.这是正常的expr恢复比给定为变量更多或更少的值; nil用作任何缺席值的默认值,并丢弃任何多余的值.