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)
凡n与p现在等于1和2分别.以上就是我在脑海中思考它的方式,但它不起作用.我尝试使用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因为它们更好,而且是执行某些类型的分配的唯一方法.
听起来像destruct-bind(它在底部的方式)可能会做你想要的.
此外,HyperSpec描述,但我认为其他链接更好地演示了它.
(destructuring-bind (x y z) (list 1 2 3) (+ x y z))
Run Code Online (Sandbox Code Playgroud)
对于有列表并希望将其值分配给多个变量的情况,DESTRUCTURING-BIND是可行的方法.
但是,对于pythonic"返回一个列表或元组,使用一个列表或变量元组来分配给"case,它(可能)lispier使用多个返回值和MULTIPLE-VALUE-BIND.