gpt4 book ai didi

scheme - 关于 "set!"和 "let"表达式

转载 作者:太空宇宙 更新时间:2023-11-03 18:57:37 25 4
gpt4 key购买 nike

我在文件 a.scm 中定义了这个小程序:

(define f
(let ((x 0))
(lambda ()
(set! x (+ 1 x))
x)))

反复调用f,结果不断增加:

CHICKEN
(c) 2008-2016, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.11.0
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2016-08-23 on buildvm-13.phx2.fedoraproject.org

#;1> (load "a.scm")
; loading a.scm ...
#;2> (f)
1
#;3> (f)
2
#;4> (f)
3
#;5>

有人能解释一下为什么 x 仅在第一次调用 f 时绑定(bind)到 0 吗?我希望每次调用 f 时,都应该执行 let 绑定(bind)。

此外,如果在重复调用时,x 未绑定(bind)到 0 那么 lambda 表达式如何知道 x 是一个其主体内的“自由变量”(而不是返回诸如“变量未绑定(bind)”之类的错误)?

谢谢。

最佳答案

Could someone please throw some light as to why x is bound to 0 only the first time f is invoked?

f调用时,

x 绑定(bind)到 0 不是,但是当它创建时。

让我用 Common Lisp 重写你的函数:

(let ((x 0))
(defun f ()
(incf x)))
(f)
==> 1
(f)
==> 2
(f)
==> 3
(f)
==> 4

f 是变量 x 的闭包。

IOW,当创建 f 时,x 绑定(bind)到 0 并在 f 中可用 - 而且f 中。

关于scheme - 关于 "set!"和 "let"表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44681281/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com