From 1f02303cb4837de7f3953b8798dd72f1523350a6 Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Fri, 1 Sep 2023 12:44:46 +0900 Subject: [PATCH] [obsidian] vault backup: 2023-09-01 12:44:45[ --- ...ustでの評価文脈(環境)のRAIIっぽい実装.md | 33 +++++++++++++++++++ content/音楽プログラミング言語.md | 4 ++- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 content/Rustでの評価文脈(環境)のRAIIっぽい実装.md 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