gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:34:29 26 4
gpt4 key购买 nike

谁能简单解释一下区别?我不认为我从我咨询过的教科书/网站中理解了这个概念。

最佳答案

Let 是平行的,(有点;见下文) let* 是顺序的。 Let 翻译为

((lambda(a b c)  ... body ...)
a-value
b-value
c-value)

但是 let* 作为
((lambda(a)
((lambda(b)
((lambda(c) ... body ...)
c-value))
b-value))
a-value)

并因此创建嵌套范围 block ,其中 b-value表达式可以引用 a , 和 c-value表达式可以同时引用 ba . a-value属于外部范围。这也相当于
(let ((a a-value))
(let ((b b-value))
(let ((c c-value))
... body ... )))

还有 letrec ,允许递归绑定(bind),其中所有变量和表达式属于一个共享范围并且可以相互引用(有一些与初始化有关的警告)。它相当于
(let ((a *undefined*) (b *undefined*) (c *undefined*))
(set! a a-value)
(set! b b-value)
(set! c c-value)
... body ... )

( in Racket ,也可用作 letrec* 在 Scheme 中,因为 R6RS ),或
(let ((a *undefined*) (b *undefined*) (c *undefined*))
(let ((_x_ a-value) (_y_ b-value) (_z_ c-value)) ; unique identifiers
(set! a _x_)
(set! b _y_)
(set! c _z_)
... body ... ))

( in Scheme)。

更新: let实际上并没有并行计算它的值表达式,只是它们都是在相同的初始环境中计算的, let表格出现。从 lambda 中也可以看出这一点。基于 - 的翻译:首先在相同的外部环境中对每个值表达式进行评估,然后收集结果值,并且只有 然后 为每个 id 创建新位置,并将值放在每个位置中。如果其中一个值表达式改变了由后续存储访问的存储(即数据,如列表或结构),我们仍然可以看到顺序性。

关于scheme - 对 Scheme 中 let 和 let* 的区别感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15003518/

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