首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >请解释lisp的多值绑定

请解释lisp的多值绑定
EN

Stack Overflow用户
提问于 2013-07-27 18:18:11
回答 1查看 3.7K关注 0票数 10

我读过这些文档(几个不同的版本!)但我不能完全把我的头绕在multiple-value-bind身上。

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

  • 第一个参数是将要绑定的变量列表。
  • 下一个参数是绑定到变量的值列表。
    • 我说对了吗?这两个列表必须是相同的长度吗?

  • 最后一个参数(它是可选的吗?)是一组代码,可以对具有新绑定值的变量进行操作。

这显然是文档读取的方式,它与我正在阅读的代码相吻合,但不太符合我的要求。当我尝试从零开始创建一个multiple-value-bind语句作为一个测试时,我会遇到麻烦。最后我得到了这样的结果:

代码语言:javascript
复制
? (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),其内容如下:

代码语言:javascript
复制
(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;请给我一点启发。

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-27 18:32:21

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

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

因此,基本上,multiple-value-bind表单如下所示:

代码语言:javascript
复制
(multiple-value-bind (var-1 .. var-n) expr
  body)

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

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17900996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档