From f8ca2b6efd3bca0eaddac9dc835d919cfade2a1a Mon Sep 17 00:00:00 2001 From: "Tomoya Matsuura(MacBookPro)" Date: Fri, 1 Sep 2023 19:08:25 +0900 Subject: [PATCH] [obsidian] vault backup: 2023-09-01 19:08:25 --- content/Rust.md | 1 + ...ustでの評価文脈(環境)のRAIIっぽい実装.md | 27 ++++++++++++------- ...of digital signal processing algorithms.md | 2 +- 3 files changed, 19 insertions(+), 11 deletions(-) create mode 100644 content/Rust.md diff --git a/content/Rust.md b/content/Rust.md new file mode 100644 index 00000000..83c7db72 --- /dev/null +++ b/content/Rust.md @@ -0,0 +1 @@ +#tools #software diff --git a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md index 984fe3d2..a04e996e 100644 --- a/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md +++ b/content/Rustでの評価文脈(環境)のRAIIっぽい実装.md @@ -1,27 +1,34 @@ #programming-language #compiler-design -chumskyのチュートリアルで、評価する関数をライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った +[chumskyのチュートリアル](https://github.com/zesterer/chumsky/blob/main/tutorial.md)で、評価する関数の実装がライフタイム付きでこんな感じになってたの頭いいなと思ったので、RAIIにしたらもっとシンプルに見えるのではと思った + +OCamlとかの関数型言語とかみたいに、`env :: newbind`とかするのはRustではイテレータとか使いづらいしやっぱ微妙、というのもある ```rust -fn eval<'a>(expr:Expr,env:&'a mut Vec<(String,Val)>)->Result{ - match expr { +fn eval<'a>(expr: &'a Expr, vars: &mut Vec<(&'a String, f64)>) -> Result { + match expr { ... - Expr::Let(name,e,then)=>{ - env.push((name,eval(e,env))); - let res = eval(then,env); - env.pop(); - res - } + Expr::Let { name, rhs, then } => { + let rhs = eval(rhs, vars)?; + vars.push((name, rhs)); + let output = eval(then, vars); + vars.pop(); + output + }, ... } } ``` -Environmentは評価全体で見ればLetやLambdaごとに分岐していく構造だけれど、局所的には1列のベクタで表現できる +Environmentは評価全体で見ればLetやLambdaごとに分岐していく構造だけれど、局所的には1列のベクタで表現できるので、実は`Vec`で十分 こんな感じすかねえ +[[Rust]]初心者には逆にわかりにくかもしれないな、、、 + +lookupでは値をコピーして返してる(このオブジェクトが有効な期間は中身のベクタの不変参照を返すことができないため) + ```rust struct EnvironmentT<'a, T: Clone>(&'a mut Vec<(String, T)>, usize); diff --git a/content/The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithms.md b/content/The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithms.md index 392bdcae..2adf5723 100644 --- a/content/The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithms.md +++ b/content/The w-calculus a synchronous framework for the verified modelling of digital signal processing algorithms.md @@ -127,7 +127,7 @@ let eval e env n = repeat n (fun () → imachine e env) imachine ef env ptr ``` -これ、Rustで改めて簡単に実装してみて思ったけど、heapの中のデータ構造がどうなってるか(初めにどうやってどのサイズのヒープを確保すべきか)が一番重要なのにそこに触れられていないのでは、、、 +これ、[[Rust]]で改めて簡単に実装してみて思ったけど、heapの中のデータ構造がどうなってるか(初めにどうやってどのサイズのヒープを確保すべきか)が一番重要なのにそこに触れられていないのでは、、、 #### C:[[MetaOCaml]]での多段階インタプリタ