[obsidian] vault backup: 2023-09-01 12:44:45[
This commit is contained in:
parent
3f7f6e0c64
commit
1f02303cb4
33
content/Rustでの評価文脈(環境)のRAIIっぽい実装.md
Normal file
33
content/Rustでの評価文脈(環境)のRAIIっぽい実装.md
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
#programming-language #compiler-design
|
||||||
|
|
||||||
|
chumskyのチュートリアルで、評価する関数をライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った
|
||||||
|
|
||||||
|
```rust
|
||||||
|
fn eval<'a>(expr:Expr,env:&'a mut Vec<(String,Val)>)->Result<Val,Error>{
|
||||||
|
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<T>)
|
||||||
|
|
||||||
|
impl<'a,T> Environment{
|
||||||
|
pub fn new()->Self{
|
||||||
|
Self(&mut Vec::new())
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
@ -10,3 +10,5 @@
|
|||||||
[[音楽プログラミング言語の形式化]]
|
[[音楽プログラミング言語の形式化]]
|
||||||
|
|
||||||
[[多段階計算]]
|
[[多段階計算]]
|
||||||
|
|
||||||
|
[[Rustでの評価文脈(環境)のRAIIっぽい実装]]
|
Loading…
Reference in New Issue
Block a user