write ahead log

ロールフォワード用

何度か挫折しつつ不純lispインタプリタを作った

作りました.

github.com

詳細はgithubのREADMEをどうぞ.(酷い英語ですが)

当初は純lispを作ろうと思ったのでpureという名前ですが, tak関数を動かしたいなど欲が出てきたので 純粋でも何でもなくなってます.

GCはありますが, マクロはありません.
(私がマクロをちゃんと理解してないので)

作成時の参考文献は一番下に記載するので興味のある方はご覧ください.

以下は駄文です.

作り始めたきっかけ

以前から何か言語処理系を作ってみたいなと思っていました.
Brainf*ckはともかく, 作ったことがなかったので.

それとは全く別に私は今27才で, 25,27,32というのは個人的に特別な節目になる年齢じゃないかと感じていました.

SIerにいると年齢と共にプログラミングする機会が減っていくのでなんとなく腕試ししたくなる事がよくあります.

「プログラマを名乗るならここら辺で小さくてバグだらけでも良いので言語処理系を作っておきたいな」という事で着手してみました.

何から始めたものか

とはいえ何から始めたらよいのかという事でとりあえずググって色々調べてみました.
が, イマイチピンときません.

ここら辺で割と心が折れます.

本やOSSのコードを写経する事を試みる

とりあえず何かを真似したいという事でOSSやコードの載っている本を買って写経する事を試みました.

lispとかなら割とサンプルも多かったので調べるといくつか出てきます.

が, これもまたイマイチピンときません.

作ってる感がないというか, あんまり頭に入ってこなかったんですよね.

わかったよーな, わからんよーな.

rebuildを聞く

弱ったなーという事で気分転換にrebuild.fmを聞く事にしました. この時まで聞いたことなかったんですが, 以前Cコンパイラ作る記事を見たことがあるruiさんが出るという事でタイミング的にもいいし聞いてみようかなと.

この回だったかな?

(そういえばこの後Matzさんも出てますね.たまたまですが時期がよかった)

トークの中で東大のCPU実験の話がありましたが,その文脈でruiさんから出た
「やってみればいいじゃないですか?」的な一言がとても心に残りました.

細かい文脈などは忘れてしまったんですが,それだけが心に残っています.

やってみる

「まぁ,そりゃそうだな」という事で参考文献ばかり漁らずにやってみることにしました.
とりあえず小さく始めることがベストという事で極小のlisp定義を漁ります.

するとwikipediaで以下を見つけました.

純LISP

「あぁ,こいつならなんとかなるかも」という事でターゲットをこれに絞ります.

1st try

Lispならまぁ大体

  • Readで読んでS式にして
  • Evalで実行し
  • Printで実行結果のS式を文字列にする

という3工程だろうと考えました.

あとはデータ構造ですが,これはLispなら大変わかりやすいので(アトムとペアしかない)何となくこの2つを作ればうまくいくだろうということで着手します.

これで8末くらいから初めて9月末くらいでReadして何かしらEvalしてPrintというところまでこぎつけました.(car, cdrとかは動いた)

が,変数スコープなどを足そうとすると一気に難しくなります.

このあたりで既存コードで作り続けるのは辛いなという事で一度挫折しました.

2nd try

ならもう作り直せばいいわ.という事でゼロからもう一度作り始める事にしました.

1度作ってるだけあってリトライは割とうまくいき, 9月末から始めて10月中頃には終える事が出来ました.日数だと8日かな.

実装を終えて

勉強になったというよりはかなり面白かったというのが正直なところです.
勉強がどうとかいうと聞こえはいいですが,結局面白いのが一番だというのが個人的な結論でしょうか. あとはちょっとでもやり続ける事も割と大事でした. 子供もいるのでなかなか時間が作れないのですが, 仕事の休憩中とか5分でも,その5分で1機能作れたりしましたし.

  • やってみればいい
  • 面白ければ何とかなる
  • 1日5分でいいので続ける

あとはあのタイミングでrebuild.fmを聞かなければおそらく挫折していたと思います. ruiさんとmiyagawaさんにはここでひっそりと感謝を.

参考文献

参考サイトが多すぎるので最早覚えてないのですがブラウザのブックマークに残っているものを並べておきます.

純LISP - wikipedia

  • 間違えなく一番参照回数が多い
  • この記事を見なかったらたぶん作ってない
  • あんまり助かったので初めてwikipediaに寄付しました

rui314/minilisp

  • ruiさんによるlisp実装
  • 機能おおすぎ凄い(macroまであるっぽい)
  • コードきれいだしすごい
  • 困って頭抱えた時に参照した.
  • なので似たコードがちょいちょいあると思う(evalListとか名前一緒)

MiSPLi

  • jsで実装されているlisp
  • かなり良く出来ていてカッコイイ
  • たまにlispの一般的な挙動を確認したいときに使いました

Common Lisp で作る micro Scheme

  • 作り方というよりLISP自体に関する解説がわかりやすかった

ガベージコレクションの実装法と評価

  • どこかの大学の資料(どこなんだろ?確認してないですすんません)
  • GC作る時に役立った

Rubyソースコード完全解説 - 第5章 ガ-ベージコレクション

  • GC作る時にとても役立った
  • 実は以前に一度読んでいたので読みやすかった
  • ありがとう, ありがとう

竹内関数 - wikipedia

  • これを動かせるようにしないと終わらない(気がした)