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> 到另一个变量。
如果您重命名临时变量 a
和 b
,例如:
(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 定义是啥? [复制]