インタプリタ内部実装のイメージを知る
トークナイズ→AST構築まではコンパイラと同じ
ASTを走査する際に、コードを生成するのではなく実行するのがコンパイラとの違い
全ての値をValueで表現する形に近い
code:rs
enum Value {
Int(i64),
String(String),
Bool(bool),
}
code:rs
// x = 42
let x = Value::Int(42);
a + bのような式はmatchで行うといい
このため、Int + Stringのルールにマッチしなければ実行時エラー
code:rs
fn add(lhs: Value, rhs: Value) -> Result<Value, String> {
match (lhs, rhs) {
(Value::Int(a), Value::Int(b)) => {
Ok(Value::Int(a + b))
}
_ => Err("type error".into()),
}
}