TAPLの実装を写経する

内容の理解が大切で、低利定理証明系のCoqも面白いんですけど、実装の理解も大切です。

とりあえず、ソースを眺めてるだけだと分からない事も多いので写経しながら、自分の好みにあわせて書き換えてみてます。

Scalaのioを使ってテキストを読み込み、パーサーコンビネータを使って構文解析してインタプリタで実行する。っていうソースが沢山あるんですけど、パーサコンビネータでPackRatParserを使えたり、フォーマット用のライブラリはこう使うんだぁとか、へーって思う所が多くて楽しいです。パーサがコメントをどこで処理しているか分からないんですけど。

自分の中でScalaは2.7くらいで止まっていて新しい書き方の導入には非積極的なんです。どうしても使いたい機能は使ってると思うんですけど、新しい物を次から次へと導入しようとするとそれだけで大変になってしまうので。だったら、Scalaもいらないんじゃね?って思うけど、いやいや、やっぱり、パターンマッチ欲しいし、Javaっぽく書きたいし作ろうとしている言語に近いしということでScalaが一番いいんです。

変更してみた点は以下の通りです。

  • sbtはメイン関数を探してリストアップしてくれるのですが、順番がバラバラだと、良くわからなくなるので、パッケージ名を_01arithみたいにして順番に実行出来るようにする。
  • Util内のprint.scalaが見に行くのが面倒なのでパッケージ内に毎回コピーする
  • exampleのソースも毎回見に行くのが面倒なので、demo.taplと名前を変えてパッケージ内に持ってくる。
  • ArithDemoをDemoに、ArithParsersをParsersに名前を変えてコピってすぐ使えるようにする。
  • if(a) process() else throw new Exceptionをif(!a)throw new Exception; process() とネストを減らす

sbtを使うのが億劫だったのですが、sbtとSublime Text 2で作業してます。src/main/scala/_01arith/core.scalaとかにファイルを置くと勝手にやってくれるところはありがたいです。

>sbt
>~compile でソース監視状態で自動コンパイル リターンで抜ける
>run メインを探してリストアップ
Enter Number: n メインを選択して実行。

sbt、のソースのネスト深すぎだろとは思うんですけど。

今はarithとuntyped、 tyarithが終わってfulluntypedをやってる所です。fulluntypedはboolやレコードや代入、自然数等があってなかなかボリュームがあって大変。これだけで本1冊書けるんじゃないの?って思うくらいのボリュームです。

情報の濃度が濃い本は難しく感じます。良くまとまっているという事なのでしょうけど、スラスラ読めないと難しいと感じるようです。分かってしまえばスラスラ読めてよいのだろうけど。で、スラスラ読めないと遅い!!!イライラして、短気だと楽しくないんですよね。スピード感が欲しい。そうなったときは、感想を書くと良いと思うんですよね。こんな風に。思った事や、覚えた事を書いていくと、本に書かれている情報量を遥かに超える文字数の文章が吐き出されるでしょう。こういう事をするとその本では足りないスピード感が得られて楽しくなるんじゃないかと思います。写経も一緒で、只読むと遅く感じるけど、写すと速く感じます。そして、覚えた気にもなれる。嫌実際、書かないより、書いた方が覚えます。飛ばす事がないからでしょうね。こんな事は書いている暇があったら読め、書けってことでしょうけど、辛いときは、辛いと吐き出すのもいいですよ。まき散らすのはよくないと言う事を考えると、ブログで書くなっていう気はしますけど。

この辺は基本なのでここをじっくり把握しておくとこの後の理解に役に立つので頑張って覚えよう。

tyarithは殆どarithと一緒ですがTyperを追加しただけで型チェックしてるけど型を持ち周るわけではなくてソースも一緒です。

fulluntypedはuntypedを大幅に拡張してboolとif文、自然数、レコード、文字列を追加して作成しました。

simpleboolはuntypedをコピーして作成しました。arithをtyarithにする感じで、untypedにboolを追加した後、タイプ追加、TmAbsにもタイプを入れて。またパーサもタイプ対応とbool対応。coreもタイプとbool対応して変えて、最後にdemoにtyperを呼ぶようにしました。

typerが入って型のチェックをやり始めた感じです。

次は、同様にfulluntypedを拡張して_06fullsimpleを作成していきます。