LISP变量交换

LISP变量交换,lisp,common-lisp,Lisp,Common Lisp,如何在不使用第三个变量的情况下在LISP中交换两个变量?另外: (rotatef a b) (让((a)b) (b)(a) …)另一种选择,“并行setf”: (psetf a b a)相当可怕的方法,它只适用于数值,但它更通用,不依赖于语法: a=a^b b=a^b a=a^b 假设之前分配了a和b,^表示逻辑排他选项。另一种方法: (setf (values a b) (values b a)) 这不会更改变量的值,只会创建新的词法绑定。@dmitry vk:这通常就是您所需要的。当然,

如何在不使用第三个变量的情况下在LISP中交换两个变量?

另外:

(rotatef a b)
(让((a)b) (b)(a) …)

另一种选择,“并行setf”:


(psetf a b a)

相当可怕的方法,它只适用于数值,但它更通用,不依赖于语法:

a=a^b

b=a^b

a=a^b

假设之前分配了a和b,^表示逻辑排他选项。

另一种方法:

(setf (values a b) (values b a))

这不会更改变量的值,只会创建新的词法绑定。@dmitry vk:这通常就是您所需要的。当然,这取决于你在做什么。
rotatef
psetf
之间的区别在于,如果
A
b
确实是更复杂的表单,那么
psetf
将对任何子表单求值两次,但
rotatef
只对它们求值一次,这是人们通常想要的。