Dev Study
← 解説「評価と環境 — 変数の表を外側へ辿り、関数呼び出しごとに新しい表を作る」に戻る

サンプルコードで身につける: 評価と環境 — 変数の表を外側へ辿り、関数呼び出しごとに新しい表を作る

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1Environment: HashMap と outer によるスコープチェーン

参照実装の をそのまま写したものです。get は自分の表に無ければ outer を辿り、define は自分の表に入れ、assign は見つかった環境で書き換えて、どこにも無ければ false を返します。実行すると関数の中の環境から base が外側で見つかり、内側の local は外から見えず、assign("base", 20) が global の値を書き換えることが分かります。

Rust

2関数呼び出しごとの新しい環境と、return の持ち上げ

手で組んだ (add(1, 2); function add(a, b) { return a + b; 99 })を exec_block で実行します。関数はの先頭で先に定義されるので()宣言より前の呼び出しが通り、呼び出しごとに を外側にした新しい環境を作り、return は Completion::Return で呼び出し元まで持ち上げて残りの 99 は実行しません。実行すると最後の値が Number(3.0) で、仮引数 a は global に残っていないことが分かります。

Rust

3実務に写す: テンプレートの変数展開

サイト全体 → ページ → 繰り返しの 1 件、と Environment を重ね、{{name}} を内側から順に探して展開する render です。ページの title がサイト既定の title を隠し、1 件ごとの環境からは name も currency も見えるのに、どこにも無い total は {{total}} のまま残ります。実行すると「カート | study-site」と 2 行の明細、合計の行が出ます。

Rust

図やコードに出てくる用語(タップで説明)