3

let-フォームは内部に複数の式を含むことができます:

(let ((x 4))
   x
  (+ x 1))

戻ります5

この式はどのように評価されますか?

4

4 に答える 4

8

これは Implicit と呼ばれbeginます。つまり、コードは次のように記述されているかのように評価されます。

(let ((x 4)) (begin x (+ x 1)))
于 2012-02-22T18:59:44.950 に答える
4

念のため、用語を明確にしましょう。フォームには、バインディングボディlet2 つの部分があります。

(let (<zero or more bindings>)
  <one or more body expressions>)

バインディングの形式(<variable> <expression>)は で、本体は一連の式です。Aletは次のように評価されます。

  • 各変数が対応するバインディングで式を評価した結果にバインドされるローカル環境を作成します。
  • 本体の式を順番に評価します。
  • 結果: 本文の最後の式の結果。
于 2012-02-22T19:13:34.017 に答える
2

あなたが説明している状況は、let式だけでなく、Schemeのいくつかの部分で発生します。以下では ...

  • let式の変数バインディングのリストの後
  • lambda式内のパラメーターのリストの後(したがって、プロシージャー定義内のパラメーターのリストの後)
  • cond式の各句の後

...式のリストを書くことができます。暗黙的に、これらの式は特別なフォームで囲まれていますbegin。評価の順序は左から右で、すべての式が順番に評価されますが、返される値は最後の式の値です。

たとえば、次の式は次のとおりです。

(cond ((= 1 1) 1 2 3))

と同等です:

(cond ((= 1 1) (begin 1 2 3)))

どちらの場合も、戻り値はです3。これは、リストの最後の式の値だからです。

于 2012-02-22T19:10:20.570 に答える
1

最初に、用語について説明します。変数バインディングの後の式はまとめて本体と呼ばれ、本体内の各式は本体式です。元:

(let ((variable-1 value-1)
      (variable-2 value-2))
  body-expression-1
  body-expression-2)

本体の表現をbegin--で囲んで(let ((x 2)) x (+ x 1))いるのは と同じ(let ((x 2)) (begin x (+ x 1)))です。

の各ボディ式beginが評価され、最終的な式の戻り値がボディ全体の戻り値として使用されます。例:(begin (+ x 1) (+ x 2))を評価(+ x 1)(+ x 2)、評価の結果を返し(+ x 2)ます。

のすべての本体式にbegin副作用がない場合、プログラムの実行時の動作を変更することなく、最後の本体式を除くすべてを削除できます。ここでの唯一の例外は、予備のボディ式の 1 つが実行に時間がかかる/戻らない/エラーが発生する場合です。ボディ式を削除すると、プログラムの実行時の動作が変更され、問題が解消されます。

ただし、副作用のある関数を使用する場合は、副作用のために 1 つ以上の関数を呼び出してから値を返す機能が役立ちます。

于 2012-02-23T04:56:38.580 に答える