誰でも簡単に違いを説明できますか?参考にした教科書やサイトの概念を理解していないと思います。
質問する
10929 次
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
したがって、式が を参照できa
、c-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 に答える