任何人都可以简单地解释一下有什么区别? 我不认为我的理解从课本/网站我咨询的概念。
Answer 1:
如果您使用的let
,你不能引用以前在同一个定义的绑定let
表达。 例如,这是不行的:
(let ((x 10)
(y (+ x 6))) ; error! unbound identifier in module in: x
y)
但是如果你使用let*
,它可以参考以前的绑定在同一个let*
表达式:
(let* ((x 10)
(y (+ x 6))) ; works fine
y)
=> 16
这一切都在这里的文档。
Answer 2:
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)
并因此创建嵌套范围块,其中b-value
表达可以指a
,和c-value
表达可以指既b
和a
。 a-value
属于外部范围。 这也相当于
(let ((a a-value))
(let ((b b-value))
(let ((c c-value))
... body ... )))
还有letrec
,允许递归绑定,其中所有变量和表达式属于一个共享范围,并且可以相互引用(与关于初始化一些注意事项)。 它相当于要么
(let ((a *undefined*) (b *undefined*) (c *undefined*))
(set! a a-value)
(set! b b-value)
(set! c c-value)
... body ... )
( 球拍 ,也可作为letrec*
方案,因为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 ... ))
( 方案 )。
更新: let
实际上并不平行评估其价值的表现形式,这只是他们都在的相同的初始环境评估let
形式出现。 这也是从清lambda
为基础的翻译:第一个值表达式中一样,外部环境中的每个评估,并将得到的值被收集, 才把新的地点为每个ID创建和值将每个在其地点。 我们仍然可以看到的顺序性,如果值表达式的一个变异的存储(即数据,如列表或结构)通过随后的一个访问。
文章来源: Confused by the difference between let and let* in Scheme