diff --git a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md new file mode 100644 index 00000000..7bd5307e --- /dev/null +++ b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md @@ -0,0 +1,33 @@ +#programming-language #compiler-design + +chumskyのチュートリアルで、評価する関数をライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った + +```rust +fn eval<'a>(expr:Expr,env:&'a mut Vec<(String,Val)>)->Result{ + match expr { + ... + Expr::Let(name,e,then)=>{ + env.push((name,eval(e,env))); + let res = eval(then,env); + env.pop(); + res + } + ... + + } +} +``` + +Environmentは評価全体で見ればLetやLambdaごとに分岐していく構造だけれど、局所的には1列のベクタで表現できる + +```rust +struct<'a,T> Environment(&'a mut Vec) + +impl<'a,T> Environment{ + pub fn new()->Self{ + Self(&mut Vec::new()) + } + +} + +``` \ No newline at end of file diff --git a/content/音楽プログラミング言語.md b/content/音楽プログラミング言語.md index 841a5178..ec774a7b 100644 --- a/content/音楽プログラミング言語.md +++ b/content/音楽プログラミング言語.md @@ -9,4 +9,6 @@ [[音楽プログラミング言語の形式化]] -[[多段階計算]] \ No newline at end of file +[[多段階計算]] + +[[Rustでの評価文脈(環境)のRAIIっぽい実装]] \ No newline at end of file