我已经阅读了文档(几个不同的版本!),但我无法完全理解 multiple-value-bind
。
这是我(认为我)知道的:
- 第一个参数是要绑定(bind)的变量列表。
- 下一个参数是绑定(bind)到变量的值列表。
- 这两个列表的长度必须相同,我说得对吗?
- 最后一个参数(它是可选的吗?)是一段代码,可以用新绑定(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 个变量被乘法绑定(bind)(q 和 r),但只有一个值 (floor n m)
。或者另一个值是 cons
语句,没有主体?!
如您所见,我完全没有得到multiple-value-bind
;请赐教。
谢谢!
最佳答案
您使用“未绑定(bind)变量”的第一个示例是由于您的拼写错误 multiple-value-bind
。尝试修复拼写;您应该会看到不同的结果。
关于你的第二个问题,floor
返回两个值,floor 和余数。请记住,values
并不是唯一返回多个值的函数!
所以,基本上,multiple-value-bind
形式看起来像这样:
(multiple-value-bind (var-1 .. var-n) expr
body)
其中expr
是一个返回多个值的表达式,这些值绑定(bind)到var-1 .. var-n
中给定的变量名;这些变量可用于 body
。 expr
可以返回比作为变量给出的值更多或更少的值; nil
用作任何缺失值的默认值,任何多余的值都将被丢弃。
关于lisp - 请解释 lisp 的多值绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17900996/