【问题标题】:set of x and x does not work in let in Schemex 和 x 的集合在 Scheme 中的 let 中不起作用
【发布时间】: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,隐式使用它们)

标签: scheme racket chez-scheme


【解决方案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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-22
    • 2020-05-06
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 2010-10-31
    相关资源
    最近更新 更多