通过让让*方案之间的区别感到困惑(Confused by the difference betwee

2019-07-20 07:59发布

任何人都可以简单地解释一下有什么区别? 我不认为我的理解从课本/网站我咨询的概念。

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表达可以指既baa-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
标签: scheme let