◆ Rust をインタラクティブに動かせる
◆ REPL もあるし Jupyter のノートブックの種類としても使える
◆ 最初の実行が遅いけど以降はそれほど遅くない

こんなプロジェクトを見つけました
https://github.com/google/evcxr

Rust の REPL って昔は非公式なものがありましたが バージョンが上がったことで使えなくなり 実質 REPL は存在しない状態でした
これも非公式ですが Rust で REPL が使えるようになり Jupyter のカーネルとしても使えます
気楽にインタラクティブに動かして試せるというだけでその言語の使うハードルが一気に下がるのでとても良いものだと思います

よくみると Google のリポジトリになっていて Google 製なの?と驚きましたが 最後に注意書きがありました
元の作者が Google で働いてたってだけで Google が公式にサポートしてるプロダクトではないようです

Jupyter で使ってみる

Jupyter で動かせるなら REPL よりも Jupyter のほうが複数行を書けたりブロックを分けれたりと便利なのでこっちを試してみました
基本は README のとおりにインストールするだけです
https://github.com/google/evcxr/blob/main/evcxr_jupyter/README.md

Linux は Ubuntu 系しか手順が用意されてないので WSL や Docker で試します

rustup component add rust-src
sudo apt install jupyter-notebook cmake build-essential
cargo install evcxr_jupyter
evcxr_jupyter --install

こういうのってだいたい何か問題が起きてググることになるのですが 特にエラーもなくスムーズにインストールできました
後は普通に起動します

jupyter-notebook

ただ WSL やコンテナ内だとエラーが出ることがあります
ここは Rust とか関係なく Jupyter 側のものなのでいつもの方法で対処できます

OSError: [Errno 99] Cannot assign requested address

というエラーだと --ip=0.0.0.0 で IP を指定します

root で実行してるなら許可するために --allow-root をつけます
ブラウザが開けるようになってなければ --no-browser をつけます

起動したら Jupyter notebook の URL にアクセスして 新規ノートブックを作成しようとすれば Python3 以外の選択肢として Rust が並んでいます
ここで Rust を選べばあとはコードを書いて実行すれば動きます

fn add(a: i32, b: i32) -> i32 {
a + b
}

add(1, 2)
3

という感じです

rust-jupyter

実行結果を表示するには最後が ; で終わらないようにする必要があります

1 + 1;

だと 2 は出力出ませんが

1 + 1

だと出力されます

println! を使って出力もできます

#[derive(Debug)]
struct Point(i32, i32);
let p = Point(1, 2);
println!("{:?}", p);
Point(1, 2)

実行ファイルは evcxr_jupyter になってます

let args: Vec<String> = std::env::args().collect();
args
["/root/.cargo/bin/evcxr_jupyter"]

:dep コマンドで crate のロードもできるようです

:dep rand = { version = "0.7.3" }
let x: u8 = rand::random();
x
248

その他の説明や例はリポジトリ内で充実してます

https://github.com/google/evcxr/blob/main/COMMON.md
https://github.com/google/evcxr/blob/main/evcxr_jupyter/samples/evcxr_jupyter_tour.ipynb