请解释lisp';s多值绑定
我已经阅读了这些文档(几个不同的版本!),但我不能完全理解请解释lisp';s多值绑定,lisp,common-lisp,multiple-value,Lisp,Common Lisp,Multiple Value,我已经阅读了这些文档(几个不同的版本!),但我不能完全理解多值绑定 以下是我(认为我)知道的: 第一个参数是要绑定的变量列表 下一个参数是绑定到变量的值列表。 这两个列表的长度必须相同,对吗 最后一个参数(是可选的吗?)是一个代码体,它可以对具有新绑定值的变量进行操作 这似乎就是文档的阅读方式,它符合我正在阅读但不完全理解的代码。当我尝试从头开始创建一个多值bind语句作为测试时,我遇到了麻烦。我最终得到的结果如下: ? (mulitple-value-bind (x y z) (val
多值绑定
以下是我(认为我)知道的:
- 第一个参数是要绑定的变量列表
- 下一个参数是绑定到变量的值列表。
- 这两个列表的长度必须相同,对吗
- 最后一个参数(是可选的吗?)是一个代码体,它可以对具有新绑定值的变量进行操作
多值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 >
(multiple-value-bind
(q r)
(floor n m)
(cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
body)
(我有点希望按照66
的思路进行输出)(如果重要的话,我会使用Clozure CL,尽管我认为不应该)
另外,我正在查看一些示例代码(试图理解Project Euler),其内容如下:
? (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 >
(multiple-value-bind
(q r)
(floor n m)
(cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
body)
(注意:我可能缩进错误,这可能会影响我的理解能力)
我不明白的是,在我看来,好像有两个变量被乘法绑定(q&r),但只有一个值(floor n m)
。或者另一个值是cons
语句,并且没有主体
正如您所看到的,我完全没有得到多值绑定
;请开导我
谢谢 第一个使用“unbound variable”的示例是由于拼写错误造成的
多值绑定
。尝试修正拼写;你应该会看到不同的结果
关于第二个问题,floor
返回两个值,floor和余数。请记住,values
不是唯一返回多个值的函数
因此,
多值绑定
表单基本上如下所示:
? (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 >
(multiple-value-bind
(q r)
(floor n m)
(cons (nth q lst) (permute-b r (remove-nth q lst)))
)
(multiple-value-bind (var-1 .. var-n) expr
body)
其中,
expr
是一个返回多个值的表达式,这些值绑定到var-1.中给出的变量名。。var-n
;这些变量可在正文
中使用。expr
返回的值可以多于或少于作为变量给出的值nil
用作任何缺失值的默认值,多余值将被丢弃。Aha!果然,修正了打字错误。所以也许我比我想象的更了解m-v-b!谢谢克里斯指出我原稿中的错字。我将把它留在这里,因为否则这个问题就没有多大意义了(原来我理解得比我想象的好;我就是不会打字!:)很好的解释,谢谢!