28

誰でも簡単に違いを説明できますか?参考にした教科書やサイトの概念を理解していないと思います。

4

2 に答える 2

30

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したがって、式が を参照できac-value式が と の両方を参照bできるネストされたスコープ ブロックを作成していaます。a-value外側の範囲に属します。これも同等です

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

letrecすべての変数と式が 1 つの共有スコープに属し、相互に参照できる再帰バインディングを可能にするもあります (初期化に関するいくつかの注意事項があります)。次のいずれかに相当します。

(let ((a *undefined*) (b *undefined*) (c *undefined*))
  (set! a a-value)
  (set! b b-value)
  (set! c c-value)
  ... body ... )

( Racketで、 R6RSletrec*以降、Scheme と同じように利用可能)、または to

(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に対して新しい場所が作成され、値がそれぞれの場所に配置されます。 . 値式の 1 つが、後続の値式によってアクセスされるストレージ (つまり、リストや構造体などのデータ) を変更する場合でも、連続性を確認できます。

于 2013-02-21T15:28:56.837 に答える