元组解包类似于Python,但在Common Lisp中

时间:2011-05-16 02:29:30

标签: python list lisp common-lisp iterable-unpacking

有没有办法将列表的值分配给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

3 个答案:

答案 0 :(得分:12)

使用DESTRUCTURING-BIND,这可以比排序解压缩更多。喜欢按关键字和可选参数等进行分配。实际上,您可以使用函数的参数列表进行任何操作。

但是如果你实际上没有一个要进行结构化的列表,并希望一次设置一堆变量,那就使用PSETF

(psetf n 1
       p 2)

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

# Python
n, p = p, n
x, y, z = z, x, y
;; Lisp
(psetf n p
       p n)
(psetf x z
       y x
       z y)

实际上,你可能会在世俗的LET中侥幸逃脱。

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

答案 1 :(得分:9)

听起来像destructuring-bind(它位于底部)可能会做你想要的。

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

(destructuring-bind (x y z) (list 1 2 3) (+ x y z))

答案 2 :(得分:6)

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

然而,对于pythonic“返回一个列表或元组,使用一个列表或变量元组来分配给”case,它(可能)lispier使用多个返回值和MULTIPLE-VALUE-BIND。