でこてっくろぐ ねお

UbieのSRE。でこらいふろぐ(http://dekolife.hatenablog.com/)の姉妹版。デコテックログ(deko tech log)である

"簡単なプログラミング言語を作るライブコーディング" の中身をRustで作ってみた

以下youtube動画はCで簡単なプログラミング言語を作っているのですが、同様のものをRustで作ってみました。

www.youtube.com

成果物

github.com

./run_test でテストが動きます

フィボナッチ数列を表示している様子

$ cargo run 'F[P(a) F(b + a b)] F(1 1)'
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/lang 'F[P(a) F(b + a b)] F(1 1)'`
1
1
2
3
5
8
13
21
34
55
89
144
233
…(以下オーバーフローするまで続く

なぜこれを行おうとしたか

最近、ユーチューバーになろうと思っていたのです。で、私がyoutubeで見せられそうなことと言ったら、プログラミングとかWebサービスインフラ構築とかをユーチューブ動画にすることかな〜と思ってまずは先駆者について探ろうと "youtube プログラミング" とかでGoogle検索したんですね。 そして出てきたのが上記動画。見始めたら非常に面白く、ユーチューバーになろうとしていたことも忘れて一気に見てしまいました。

で、私も作ってみたい!どうせなら最近学びたいと思っていたRustで作ってみるか!ということでRustで作ってみてます。

作った感想

元の言語がCで書かれていることもあり、Rustらしさにはほど遠い感じになりました(Rustらしさ、あまり分かってないけど少なくともunrwapしまくってるのは違う)。今後の精進が必要。 動画中でも言及されているのですが、ある程度プログラムができてくるとなんか勝手にネストした式(例: + + 1 2 + 3 1 とか、関数からの関数呼び出しとか )が動き出したりとなかなか自明ではない動きをする感じがして、ビビりました。これはすごい!

今後何かパースする時に使えるテクニックを一つ得たな、という思い。

あと、最後の方、デバッグが大変だった…

嬉しかったこと

動画中ではグローバルに状態を持っているが故にevalとeval_stringを分離しなくてはいけなかったが、このRust版は引数で状態を引き回すが故にeval_stringが不要になったこと。

今後上記プログラムを発展させたいこと

Rustらしさが現在よく分かっていないので、もっとRust学んで書き直したい。

  • unwrapしまくってるけど、ちゃんとエラー処理していきたいし、更にせっかくRust書いてるわけで try! 使っていきたい
    • 同僚に try! のsyntax sugarの hogehoge? ってのありますよって教えてもらえたので、そちら使ってみたい
  • State structのカプセル化度合いが0なのでカプセル化していきたい
    • 最初はStateなしでやっていて、最後にStateだけ導入したけど日曜日も終わりそうなので一旦諦めたのであった
  • 今は動画に倣ってシェルスクリプト内でテストしているけどRustのテスト書けばいいやん

その他

上記youtube動画の作者さんは最近私もよく聞いている Turing Complete FM や最近面白く読ませていただいている Rui Ueyama|note の作者でもあります。

以下ブログも、Turing Complete FMに触発されて書いたわけで、最近だいぶお世話になっているな、と思っています。 dekotech.dekokun.info

…早くOS完成させないと…