statements change the environment, expressions do not
do-nothing statement を定義
- 簡約した結果を再び代入
- Environmentは変化しない
- do-nothing statementを返す
- 右辺のValueをEnvironmentの指定されたKeyに対応させる
- condition is an expression
- consequence is a statement
- alternative is a statement
簡約した条件式を用いたIf statementを返す
True、Falseそれぞれに該当するStatementを簡約する
- environmentはそのまま
- second statementのみに簡約
- (簡約したfirst statement) + second statementのSequenceを返す
- 簡約によってEnvironmentを変える
if (condition)
body; # changes evironment
while (condition) do
body;
end
else
do-nothing
end
ここまででの仕様では bool + int が「未定義」 そのような場合簡約しないという例外が定義できるが、 実行時に例外が起きないことをチェックしたい:9章
small-step semantics を標準として採用している言語の紹介
small step をプログラムを小さく分解して少しずつ簡約していって振る舞いを定義する。 big stepでは直接的にプログラムがどのような振る舞いをするのかを定義する。
以下のようにEvaluateを定義
- Number, Boolean : そのまま値を返す
- Add, Multiply, LessThan : 引数を評価してOperationを実行
以下のようにEvaluateを定義
- Assignmentは、右辺値をevaluateしてenivronmentを更新
- DoNothingはEnvironmentをそのまま返すのみ
- If はconditionをevaluateし、該当するconsequenceをevaluateする
- Sequence ではまずfirst statementを評価し、それによって変更された環境を用いてsecond statementを評価する
- While ではcondition を evaluate し、true なら body を evaluate してenvironmentを更新する
small-stepと違い、big-step では Ruby の call stack を活用して 抽象構文木内の走査をする。 small-stepでは実行途中でどのように簡約が行われているのかが明示的にわかる。 big-stepでは抽象構文木の構築自体を実行者に任せる。 (small-step semantics を標準として採用している言語の紹介)