[obsidian] vault backup: 2023-09-01 12:44:45[
This commit is contained in:
		
							
								
								
									
										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())
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
@@ -9,4 +9,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
[[音楽プログラミング言語の形式化]]
 | 
					[[音楽プログラミング言語の形式化]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[[多段階計算]]
 | 
					[[多段階計算]]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					[[Rustでの評価文脈(環境)のRAIIっぽい実装]]
 | 
				
			||||||
		Reference in New Issue
	
	Block a user