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

set of x and x does not work in let in Scheme

我正在尝试 运行 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 之外 [=12] =] 符号 绑定 到另一个变量。

如果重命名临时变量 ab 例如:

(let ((a y) (b x)) (set! x a) (set! y b))

您会观察到不同的行为。

My end goal is to switch their values only with commands, not with temporary variables

看起来 racket 支持 set!-values,因此您可以交换变量而无需使用任何显式临时变量,如下所示:

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

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