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

Posted

技术标签:

【中文标题】x 和 x 的集合在 Scheme 中的 let 中不起作用【英文标题】:set of x and x does not work in let in Scheme 【发布时间】:2021-03-08 13:44:28 【问题描述】:

我正在尝试在 Scheme 中运行这一行: (let ((x y) (y x)) (set! x x) (set! y y))

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

感谢您的帮助!

【问题讨论】:

变量的值是否被限制为整数?如果是这样,有一个著名的技巧。 @tfb 我希望但没有:( 那么你至少需要一个临时变量(或类似set!-values,隐式使用它们) 【参考方案1】:

在这个表达式中:

(set! x x)

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

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

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

您将观察到不同的行为。

【讨论】:

是的,很遗憾,我无法为当前变量 (x,y) 赋予新名称。我的最终目标是仅使用命令而不是临时变量来切换它们的值 不知何故,您至少需要一个临时变量来交换值(引入中间 lambda 也算作具有临时变量(参数))【参考方案2】:

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

看起来球拍支持set!-values,因此您可以在不使用任何显式临时变量的情况下交换变量,如下所示:

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

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

【讨论】:

以上是关于x 和 x 的集合在 Scheme 中的 let 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 Scheme / Racket 中 let 的 lambda 定义是啥? [复制]

方案:从 Let 转换为 Lambda

对 Scheme 中 let 和 let* 的区别感到困惑

clojure for function resetts let

Scheme/Racket中letrec的含义

Scheme / Racket中的静态变量?