我读过这些文档(几个不同的版本!)但我不能完全把我的头绕在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 问题24),其内容如下:
(multiple-value-bind
(q r)
(floor n m)
(cons (nth q lst) (permute-b r (remove-nth q lst)))
)(注:我可能有错误的缩进,这可能会影响我缺乏理解)
我不明白的是,在我看来,似乎有两个变量是乘界的(q & r),但只有一个值(floor n m)。或者是另一个值是cons语句,而没有body?!
如你所见,我完全不懂multiple-value-bind;请给我一点启发。
谢谢!
发布于 2013-07-27 18:32:21
第一个使用“未绑定变量”的示例是由于您的multiple-value-bind拼写错误造成的。尝试修复拼写;您应该会看到一个不同的结果。
至于你的第二个问题,floor返回两个值,一个是底数,另一个是余数。记住,values不是唯一返回多个值的函数!
因此,基本上,multiple-value-bind表单如下所示:
(multiple-value-bind (var-1 .. var-n) expr
body)其中expr是一个表达式,它返回多个值,这些值绑定到var-1 .. var-n中给出的变量名;这些变量可在body中使用。expr返回的值比作为变量的值更多或更少是可以的;nil被用作任何缺失值的默认值,任何多余的值都被丢弃。
https://stackoverflow.com/questions/17900996
复制相似问题