13

有没有办法将列表的值分配给 Common Lisp 中的符号列表,类似于将元组的值分配给 Python 中的变量的方式?

x, y, z = (1, 2, 3)

就像是

(setq '(n p) '(1 2))

其中np现在分别等于12。以上只是我脑海中的想法,但它不起作用。我尝试使用 apply 如下:

(apply setq '('(n p) '(1 2)))

我是 Lisp 的新手,所以如果这是显而易见的事情,请尽量不要太苛刻,请指出我正确的方向!谢谢。

PS:我在Scheme中看到了关于这样做的帖子和Common Lisp中关于元组扩展的类似帖子,但是这些对回答我的问题没有太大帮助1)因为我没有使用Scheme,以及2)因为排名最高的答案就是这个词apply

4

3 回答 3

13

使用DESTRUCTURING-BIND,它可以比元组拆包做更多的事情。像关键字赋值,可选参数等。真的,你可以用函数的参数列表做任何事情。

但是,如果您实际上没有要解构的列表,并且想一次设置一堆变量,请使用PSETF

(psetf n 1
       2)

您也可以使用 SETF,但 PSETF 更接近于元组赋值:例如,它适用于交换/置换值。

# Python
n, p = p, n
x, y, z = z, x, y
;; 语言
(psetf np
       PN)
(psetf xz
       yx
       zy)

实际上,您可能可以摆脱平凡的 LET。

另外,不要为任何事情烦恼 SETQ。使用 SETF/PSETF 因为它们更好,而且是执行某些类型分配的唯一方法。

于 2011-05-16T04:44:47.993 回答
10

听起来像解构绑定(它在底部)可能会做你想要的。

此外,HyperSpec描述,但我认为其他链接更好地展示了它。

(destructuring-bind (x y z) (list 1 2 3) (+ x y z))
于 2011-05-16T03:07:21.060 回答
7

对于您有一个列表并希望将其值分配给多个变量的情况,DESTRUCTURING-BIND 是要走的路。

但是,对于pythonic“返回列表或元组,使用要分配的变量的列表或元组”的情况,使用多个返回值和MULTIPLE-VALUE-BIND(可能)更容易。

于 2011-05-16T10:16:18.050 回答