[obsidian] vault backup: 2023-09-01 19:08:25

This commit is contained in:
Tomoya Matsuura(MacBookPro) 2023-09-01 19:08:25 +09:00
parent 2a3d956174
commit f8ca2b6efd
3 changed files with 19 additions and 11 deletions

1
content/Rust.md Normal file
View File

@ -0,0 +1 @@
#tools #software

View File

@ -1,27 +1,34 @@
#programming-language #compiler-design #programming-language #compiler-design
chumskyのチュートリアルで、評価する関数をライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った [chumskyのチュートリアル](https://github.com/zesterer/chumsky/blob/main/tutorial.md)で、評価する関数の実装がライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った
OCamlとかの関数型言語とかみたいに、`env :: newbind`とかするのはRustではイテレータとか使いづらいしやっぱ微妙、というのもある
```rust ```rust
fn eval<'a>(expr:Expr,env:&'a mut Vec<(String,Val)>)->Result<Val,Error>{ fn eval<'a>(expr: &'a Expr, vars: &mut Vec<(&'a String, f64)>) -> Result<f64, String> {
match expr { match expr {
... ...
Expr::Let(name,e,then)=>{ Expr::Let { name, rhs, then } => {
env.push((name,eval(e,env))); let rhs = eval(rhs, vars)?;
let res = eval(then,env); vars.push((name, rhs));
env.pop(); let output = eval(then, vars);
res vars.pop();
} output
},
... ...
} }
} }
``` ```
Environmentは評価全体で見ればLetやLambdaごとに分岐していく構造だけれど、局所的には1列のベクタで表現できる Environmentは評価全体で見ればLetやLambdaごとに分岐していく構造だけれど、局所的には1列のベクタで表現できるので、実は`Vec`で十分
こんな感じすかねえ こんな感じすかねえ
[[Rust]]初心者には逆にわかりにくかもしれないな、、、
lookupでは値をコピーして返してるこのオブジェクトが有効な期間は中身のベクタの不変参照を返すことができないため
```rust ```rust
struct EnvironmentT<'a, T: Clone>(&'a mut Vec<(String, T)>, usize); struct EnvironmentT<'a, T: Clone>(&'a mut Vec<(String, T)>, usize);

View File

@ -127,7 +127,7 @@ let eval e env n = repeat n (fun () → imachine e env)
imachine ef env ptr imachine ef env ptr
``` ```
これ、Rustで改めて簡単に実装してみて思ったけど、heapの中のデータ構造がどうなってるか初めにどうやってどのサイズのヒープを確保すべきかが一番重要なのにそこに触れられていないのでは、、、 これ、[[Rust]]で改めて簡単に実装してみて思ったけど、heapの中のデータ構造がどうなってるか初めにどうやってどのサイズのヒープを確保すべきかが一番重要なのにそこに触れられていないのでは、、、
#### C:[[MetaOCaml]]での多段階インタプリタ #### C:[[MetaOCaml]]での多段階インタプリタ