【问题标题】:Scheme- using set! to change a variable方案-使用集合!改变一个变量
【发布时间】:2012-11-18 03:58:31
【问题描述】:

我有一段非常简单的代码,我只是想按照流程进行操作,我想我理解了,但我只是想确保

(define count
  (let ([next 0])
    (lambda ()
      (let ([v next])
        (set! next (+ next 1))
        v))))

基本上,count 会跟踪它被调用的次数。当您第一次调用它时,使用 let 将 next 设置为 0。稍后,使用 set! 将其更改为 1!我试图弄清楚为什么 (let ([next 0]) 不会在以后每次调用程序时将 next 设置回 0。据我所知, (lambda () ...) 是实际函数开始(不带参数),所以当你再次调用 count 时,它只是从那里执行,使用该范围内的 next 的值(集合!一个)

我想……老实说,我还是有点不确定。设置!只是自动永久更改 next 所以当你再次调用 count 时,即使第一行是 (let ((next 0))) 它实际上并没有回到零?

【问题讨论】:

    标签: scope scheme


    【解决方案1】:

    你的直觉是正确的。这部分:(let ([next 0]) 只执行一次,之前 lambda 绑定到名称 count - 这是因为第一个 let 作为它的值返回它的最后一个表达式,这恰好发生在成为lambda,这就是绑定到变量count的内容。

    函数定义结束后,count 过程的实际执行从这行开始:(let ([v next]),每次调用过程都会发生这种情况。 next 变量对于 count 过程的所有调用都是相同的,可在 count 内部访问,因为它在创建时作为 lambda 环境的一部分被捕获,位于关闭。

    【讨论】:

    • 谢谢!这实际上也消除了我的一些困惑。
    猜你喜欢
    • 2018-08-19
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    • 2011-08-31
    • 2022-07-09
    • 2023-03-08
    相关资源
    最近更新 更多