From c26aedd79ddfdc045216ca96a89e06f9e396ce50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=BE=E6=B5=A6=20=E7=9F=A5=E4=B9=9F=20Matsuura=20Tomoy?= =?UTF-8?q?a?= Date: Wed, 29 Nov 2023 15:22:30 +0900 Subject: [PATCH] [obsidian] vault backup: 2023-11-29 15:22:30[ --- ...ustでの評価文脈(環境)のRAIIっぽい実装.md | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md index 370a6949..5a95ea71 100644 --- a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md +++ b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md @@ -1,4 +1,6 @@ -#programminglanguage #compiler-design +#programming-language #compiler-design + +## 動機 [chumskyのチュートリアル](https://github.com/zesterer/chumsky/blob/main/tutorial.md)で、評価する関数の実装がライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った @@ -102,4 +104,31 @@ fn eval_ast<'a>( } } +``` + + +## 改善 + +微妙だったので結局ライフタイムで制御する方がいいのかもしれない + + +評価した時に、クロージャを作ると環境を保持する + +Valueの中ではクロージャが`Env`と、bodyで`Expr`を保持し、環境はValueを保持するので定義も内部構造も循環することになる + +全部メモリ的にフラットな構造にするためは? + +Envは評価結果のValueをIdで保持する + +一度lookupしたらEnvのインデックスに置き換えて2度目以降のアクセスはキャッシュが効くようにする + +```rust + + +struct Compiler<'a,E,V>{ + expr_pool:Arena>, + env:Environment,V>, + symbols:Interner, +} + ``` \ No newline at end of file