lisp - 请解释 lisp 的多值绑定(bind)

标签 lisp common-lisp multiple-value

我已经阅读了文档(几个不同的版本!),但我无法完全理解 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中给定的变量名;这些变量可用于 bodyexpr 可以返回比作为变量给出的值更多或更少的值; nil 用作任何缺失值的默认值,任何多余的值都将被丢弃。

关于lisp - 请解释 lisp 的多值绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17900996/

相关文章:

vector - 在 Common Lisp 中计算向量的线性组合

lisp - 如何判断列表是否包含 NIL?

for-loop - 方案中的定义语法问题

lisp - 我如何通过访问器设置树中的元素?

common-lisp - LISP 中两个位向量之间的距离

c# - 替换 proxyAddresses 值

php - mysql数据库如何处理包含多个值的字段

scheme - Racket 中的多个值和普通元组之间的区别?

lisp - 从长度为 2 的列表中获取值

scheme - `values` 在 Scheme 中是如何工作的?