在 Common Lisp 中,有没有一种方法可以将列表的值分配给符号列表,类似于在 Python 中将元组的值分配给变量的方式?
x, y, z = (1, 2, 3)
有点像
(setq '(n p) '(1 2))
其中 n
和 p
现在分别等于 1
和 2
。以上只是我在脑海中思考的方式,但它不起作用。我尝试按如下方式使用应用:
(apply setq '('(n p) '(1 2)))
我是 Lisp 的新手,所以如果这是显而易见的事情,尽量不要太苛刻,请给我指明正确的方向!谢谢。
PS:我看过关于在 Scheme 中执行此操作的帖子和类似的关于 Common Lisp 中的元组扩展的帖子,但这些对回答我的问题不是很有帮助 1) 因为我没有使用 Scheme,以及 2 ) 因为排名最高的答案只是单词 apply
。
最佳答案
使用DESTRUCTURING-BIND ,它可以做的不仅仅是元组拆包。比如关键字赋值和可选参数等。实际上,您可以使用函数的参数列表做任何事情。
但是如果您实际上没有要解构的列表,并且想一次设置一堆变量,请使用 PSETF :
(psetf n 1 p 2)
You can also use SETF, but PSETF is a closer analog of tuple assignment: it works for swapping/permuting values, for instance.
# 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,因为它们更好,而且是执行某些类型作业的唯一方法。
关于python - 元组解包类似于 Python,但在 Common Lisp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6012688/