【问题标题】:Please explain lisp's multiple-value-bind请解释 lisp 的多值绑定
【发布时间】:2013-07-27 21:11:27
【问题描述】:

我已经阅读了文档(几个不同的版本!),但我无法完全理解 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 Euler Problem 24),内容如下:

(multiple-value-bind
    (q r)
    (floor n m)
    (cons (nth q lst) (permute-b r (remove-nth q lst)))
)

(注意:我可能有错误的缩进,这可能会影响我的理解)

对此我不明白的是,在我看来,好像有 2 个变量被乘法绑定 (q & r),但只有一个值 (floor n m)。还是cons语句的其他值,没有body?!

如你所见,我完全听不懂multiple-value-bind;请赐教。

谢谢!

【问题讨论】:

  • 感谢 Chris 指出我原来的错字。我要把它留在里面,否则这个问题没有多大意义(结果我比我想象的理解得更好;我就是不能打字!:) 很好的解释,谢谢!

标签: lisp common-lisp multiple-value


【解决方案1】:

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

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


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

(multiple-value-bind (var-1 .. var-n) expr
  body)

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

【讨论】:

  • 啊哈!果然,修复错字修复了它。所以也许我比我想象的更了解 m-v-b!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-14
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多