有没有办法将列表的值分配给Common Lisp中的符号列表,类似于在Python中将元组值赋值给变量的方式?
x, y, z = (1, 2, 3)
像
这样的东西(setq '(n p) '(1 2))
n
和p
现在分别等于1
和2
。以上就是我在脑海中思考它的方式,但它不起作用。我尝试使用apply如下:
(apply setq '('(n p) '(1 2)))
我是Lisp的新手,所以如果这是显而易见的事情,请尽量不要太苛刻,请指出我正确的方向!感谢。
PS:我在Scheme中看过这样做的帖子和Common Lisp中关于元组扩展的类似帖子,但是这些对于回答我的问题并不是很有帮助1)因为我没有使用Scheme,2 )因为排名最高的答案只是单词apply
。
答案 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。