24 評価プロセス(関数呼び出し式) [オリジナル言語インタプリタを作る]
関数と関数呼び出し式 関数と関数呼び出し式の評価を実装します。ここまで字句解析、構文解析、そして評価と実装を進めてきましたが、この実装で最後です。 関数の単純な呼び出しはもちろん、引数で関数を渡したり、クロージャも動作します。 このような動作を実現するにはまず、インタプリタにおける関数の内部表現を定義しなければなりません。整数や真偽値と同じようにオブジェクトの1つとして扱います。 それから Eva […]
Web備忘録 プログラミングを中心に技術的な事柄を忘れないように書き残します。
関数と関数呼び出し式 関数と関数呼び出し式の評価を実装します。ここまで字句解析、構文解析、そして評価と実装を進めてきましたが、この実装で最後です。 関数の単純な呼び出しはもちろん、引数で関数を渡したり、クロージャも動作します。 このような動作を実現するにはまず、インタプリタにおける関数の内部表現を定義しなければなりません。整数や真偽値と同じようにオブジェクトの1つとして扱います。 それから Eva […]
環境を使ったlet文による束縛 ここではインタプリタにlet文の対応を追加し変数束縛の機能を実装します。let文に対応するということは、合わせて識別子にも対応しなければなりません。 let a = 1; この文を評価した後、x という識別子を評価すると 1 となるようにしなければならない。つまり、”a” という識別子と 1 という値の紐づけを何かしらの方法で管理する必要があ […]
インタプリタのエラー処理 これまでの評価の実装で NullObject を返していたところがいくつかあります。未定義の動作で全て Null を返しているところは本来エラーとしてプログラムで処理できるべきです。そうしないと利用したりあるいはデバッグするのが大変です。 ここで実装しようとしているのはユーザー定義のエラーではなく、内部のエラー処理のことです。実行中に発生しうる誤った演算子の利用、未定義の […]
条件分岐 if式 これから条件分岐の評価、if式の評価を実装します。if式の例を示します。 if (x > y) { x } else { y } このようなif式を考えるとき、どのような時にifのブロック文が評価されるでしょうか。条件式(x > y)が true の時なのか、それともtruthlyな値(trueもしくは非Null値)であればよいのか、これは設計上の判断です。この判断は […]
中置演算式 の評価 プログラミング言語 Gorilla がサポートする中置演算子は以下の8つです。 1 + 2; 1 - 2; 1 * 2; 1 / 2; 1 > 2; 1 < 2; 1 == 2; 1 != 2; これらの演算子は大きく2つのグループに分かれます。上4行の四則演算は結果を整数として生成するグループで、下4つの比較を行う演算は結果を真偽値で生成するグループです。 まずは […]
真偽値 整数リテラルの評価に続いて真偽値リテラルの評価を実装します。とはいえやることは整数リテラルの評価とほぼ変わりません。 テストの作成 まずはテストを作成します。 [TestMethod] public void TestEvalBooleanExpression() { var tests = new(string, bool)[] { ("true;", true), ("false", […]
評価プロセス ここまでで字句解析、構文解析と終りました。ようやくREPLでいうところの E(Eval, 評価)に移ることができます。 インタプリタにおける評価のプロセスは、プログラムがどのように動作するかを定義する必要があります。 例えば以下のプログラムを例に考えます。 let num = 5; if (num) { return 1; } else { return 0; } これが 1 を返す […]