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

Phi*_*oud 12 lisp python list common-lisp iterable-unpacking

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

x, y, z = (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

就像是

(setq '(n p) '(1 2))
Run Code Online (Sandbox Code Playgroud)

np现在等于12分别.以上就是我在脑海中思考它的方式,但它不起作用.我尝试使用apply如下:

(apply setq '('(n p) '(1 2)))
Run Code Online (Sandbox Code Playgroud)

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

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

Nie*_*jou 12

使用DESTRUCTURING-BIND,除了元组解包之外,它可以做很多事情.就像按关键字和可选参数等分配一样.真的,你可以用函数的参数列表做任何事情.

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

(psetf n 1
       p 2)

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

# Python
n, p = p, n
x, y, z = z, x, y
Run Code Online (Sandbox Code Playgroud)
;; Lisp
(psetf n p
       p n)
(psetf x z
       y x
       z y)

实际上,你可能会摆脱世俗的LET.

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

  • 对于交换和旋转,有`rotatef`:`(rotatef np)`,`(rotatef xyz)`. (2认同)

Jer*_*iah 9

听起来像destruct-bind(它在底部的方式)可能会做你想要的.

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

(destructuring-bind (x y z) (list 1 2 3) (+ x y z))
Run Code Online (Sandbox Code Playgroud)


Vat*_*ine 6

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

但是,对于pythonic"返回一个列表或元组,使用一个列表或变量元组来分配给"case,它(可能)lispier使用多个返回值和MULTIPLE-VALUE-BIND.