Scheme x和x的集合在let in方案中不起作用

Scheme x和x的集合在let in方案中不起作用,scheme,racket,chez-scheme,Scheme,Racket,Chez Scheme,我试图在方案中运行此行: (let((x y)(y x))(set!x x)(set!y y)) 其中,在程序开始时,x定义为1,y定义为2。 我希望输出是x=2和y=1,但是我得到x=1和y=2 谢谢你的帮助 在这个表达式中: (set! x x) 两个x引用相同的变量,即let绑定引入的变量。在let内部对x所做的任何更改(此处,实际值不变)在let外部都不可见,因为在let外部,x符号绑定到另一个变量 如果重命名临时变量a和b,例如: (let ((a y) (b x)) (set! x

我试图在方案中运行此行:
(let((x y)(y x))(set!x x)(set!y y))

其中,在程序开始时,x定义为1,y定义为2。 我希望输出是x=2和y=1,但是我得到x=1和y=2

谢谢你的帮助

在这个表达式中:

(set! x x)
两个
x
引用相同的变量,即
let
绑定引入的变量。在
let
内部对
x
所做的任何更改(此处,实际值不变)在
let
外部都不可见,因为在
let
外部,
x
符号绑定到另一个变量

如果重命名临时变量
a
b
,例如:

(let ((a y) (b x)) (set! x a) (set! y b))
你将观察到一种不同的行为

我的最终目标是只使用命令切换它们的值,而不是使用临时变量

它看起来像racket支持,因此您可以在不使用任何显式临时变量的情况下交换变量,如下所示:

(define x 1)
(define y 2)
(set!-values (x y) (values y x))
;;; x is now 2 and y is 1

(这甚至是链接文档中的示例)

是的,不幸的是,我无法为当前变量(x,y)指定新名称。我的最终目标是只使用命令切换它们的值,而不是使用临时变量。如何至少需要一个临时变量来交换值(引入一个中间lambda计数作为也有临时变量(参数))变量的值是否被限制为整数?如果是的话,有一个著名的技巧。@tfb我希望如此,但不是:(那么您至少需要一个临时变量(或者类似于
set!-values
,它隐式地使用它们)