海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
https://github.com/unnohideyuki/monadic_parser_sample
Alex と Haskell Happy で monadic parser をつくってみる演習は、予定していたものを一応つくれた。
ex2 から ex4 まで、それぞれ自分なりに得るものはあったので、もう少しコードをきれいにするのといっしょに、ポイントを書き留める作業はしたい。
ex4 は、まじめに Haskell の文法を解析するのではなく、レイアウト規則を実現するための最低限の grammar を記述したので、"-};" がコメントの最後と認識されなかったりするが、今回は、これでいいことにする。
https://github.com/unnohideyuki/Tiger-in-Haskell
Tiger Book を Haskell でやる遊びは、6章まで来た。
Tiger Book でも、6章あたりのコードは、ML の破壊的代入を活用したコードになっているので、Haskell で書くにあたっては、状態を明に引き回す必要がある。
chap6/Semant.hs にある transExp, transDec は level と temp を受け渡しするように改造して、改造後も chap5 と同じ型検査結果となるところまで確認。
など。
あとは、TL.allocLocal やら TL.newLevel を適切に呼んでやればいい。(それができる状態にはなった)
tDiary 2.2.1 + Ruby 1.8.7 だったのを、tDiary 4.0.4 + Ruby 2.1.2-p95 にアップデートした。
一挙にやったら文字化けしたので、tDiary 3.0.1 をはさんで、データ移行した。
これから、markdown 記法のやつ入れよう。
ん? いま、Insecure operation - encode!って出たな。
よくわからないけど、security がらみっぽいので、tdiary.conf で @secure = false となっていたのを、true にしてみた。
なんとなく、余計に厳しくなって、ダメそうなんだが…。
いけた。
https://github.com/unnohideyuki/monadic_parser_sample/tree/master/ex4
Haskell のレイアウト規則で、
If the indentation of the non-brace lexeme immediately following a where, let, do or of is less than or equal to the current indentation level, then instead of starting a layout, an empty list “{}” is inserted, ...
とある部分に未対応だった。
foo = let
in
putStrLn "foo"
main = foo
現在の版で、上記のコードを ex4/Parser に食わせると、こうなる:
foo = let
{ in putStrLn "foo" } main = foo
let と in の間に、空の {} が挿入されるべき。
いまから直す。→ と思ったけど、もう少しまじめに grammar 書かないといけなさそう。今日はやめておこう。
let {} in hoge は Parser で普通にできそうだが、現状の ex4/Parser は in をキーワードと認識してない。
Empty 'do' block は ghc はエラーにしているようだ。
※やっぱり、まだレイアウトルールがいまいちわかってないかも。
(10.3を読むべきらしい。)
Tiger Book chap6 については、Semant.hs での Temp.newLabel, TL.newLevel, TL.allocLocal 追加はやった。つぎは、findEscape を書いて、テストしたら、6章おわり。
Git for Windows は 1.9.2 にバージョンアップした。
https://github.com/unnohideyuki/Tiger-in-Haskell/blob/master/testcases/nested_funcs.tig
findEscape も書いた。テストはほとんどできていないが、ともかく、7章に進もう。
今日は水曜日なので(?)、夜にコードを書く。
Tiger book 7章の Translation to intermediate code に入った。
https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7
Tree モジュールを定義して、Translate に Exp 型を定義、そして、"left as an exercise" となっていた unCx, unNx を書くなど。
TL.simpleVar 書いた。いちおう、static links も辿るように。
そろそろ単体テスト書きながらやりたい。
https://github.com/unnohideyuki/Tiger-in-Haskell/blob/master/chap7/Translate.hs
Windows に入れるのは初めてだったような。
http://developer.android.com/sdk/index.html#download
ダウンロードしたら、適当な場所に展開して、platform-tools/ に PATH を通す
http://www.oracle.com/technetwork/jp/java/javase/downloads/jdk7-downloads-1880260.html
これも、適当な場所に展開して、jdk1.7.0_60 を JAVA_HOME に設定し、jdk1.7.0_60/bin に PATH を通す。
http://ant.apache.org/bindownload.cgi
ダウンロードして、適当な場所に展開して、PATH 通す。
Eclipse 使う気が、まったくないので、Command Line から。
http://developer.android.com/training/basics/firstapp/creating-project.html#CommandLine
SDK の tool/ ディレクトリに移動して、以下を実行するのですが、これらは git bash 上ではだめで、
「コマンド プロンプト」から。
android list target
android create project --target 1 --name Hello --path C:\Users\unno\android_prjs\Hello --activity HelloActivity --package com.example.hello
これで、プロジェクトが作成される。このままエミュレータを起動(必要なら作成して、Start):
android avd
続きは、git bash 上で(git bash でなくてもいいんですが):
http://developer.android.com/training/basics/firstapp/running-app.html
$ cd android_prjs/Hello/
$ ant debug
$ adb install bin/Hello-debug.apk
https://code.google.com/p/smali/source/browse/examples/HelloWorld/HelloWorld.smali
これも、「コマンド プロンプト」から。
> java -jar C:\Users\unno\smali\smali-2.0.3.jar -o HelloWorld.dex HelloWorld.smali
> adb push HelloWorld.dex /data/local
> adb shell dalvikvm -cp /data/local/HelloWorld.dex HelloWorld
Hello World!
昨日つくった MyFirstApp を、dalvik assembly language で再現してみた。
https://github.com/unnohideyuki/android_study
といっても、Java ソースからできた classes.dex をディスアセンブルしたやつを、またアセンブルするだけなので、そこはなんと言うこともなく。
むしろ、classes.dex 以外の部分で苦労した。
とくに、apkbuilder がよくわかんなくて。
build.sh には、なんとなく、そういう苦労がつまっています。
見よう見まねで、きちゃない。徐々に直していく。
いちお、動いた。(けっこううれしい)
# うんの [メモってみた。わかってないところは、まだわかってないままだけど。 https://github.com/unn..]
7章は読み終わり。プログラムを書き足していく前に、そろそろ単体テスト書きながらやりたい件に対処。hspec でテストを書いていくことにした。
https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7
テストを書こうとして、Translete.Level の Eq 定義の不備に気づいたりしたので、テストはやはり重要だな。
simpleVar を書いたときに、そろそろテスト書きたいと思ったわけですが、これ、テストしにくい。モジュールのインタフェースには、Translate.Exp のコンストラクタは公開するなとあるのだけど、これが非公開のままだと、simpleVar の戻り値の中身を検査できなくて、テストが書けない。
そういうわけで、コーディングはあまり進められなかったんだけど、テストを書きながらコーディングできるようにはなったので、一応よしとしよう。
Modern Compiler Implementation in Haskell, コーディングは7章、本読みは8章あたり。
https://github.com/unnohideyuki/Tiger-in-Haskell
7章のコーディングは、テストをかきつつ Semant.hs を拡張して、(6章では型チェック結果だったのを)Translate.Exp も出力するように改造しているところ。前から少しずつやっていって、Nil, Int, BinOp まで対応した。この調子で、教科書の順番どおりに進めていこう。
コーディングはまだ7章だけど、本読みは進めていて、8章の途中。8章には、「プログラミング演習」がないなと思ったら、chap8/canon.sml にすべてコードが与えられていて、「それを読んで理解せよ」という練習問題があったりする (8.1)。
あ、そういえば。いままで英語版で読んでいた Tiger book ですが、邦訳を本屋で見かけたときに買ったので、いまは邦訳版を読んでる。
Modern Compiler Implementation in ML を "in Haskell" に変えてやるの続行中なんですが。
7章は、本文の記述量と、プログラミング量の乖離が結構はげしい章なんじゃあるまいか。けっこう時間がかかってて、読むのは8章にすすんでいるのに、コーディングはまだ 7 章。
Semant 改造中で、RecordExp のところを書き直そうとして、バグに気づいてしまった(6章で見逃した潜在バグ)。
レコード定義で、各フィールドの定義が、フィールド宣言の順番どおりにならんでいることが前提になってるかのようなコーディングになってしまっている。
6章に戻ってバグとってから、再開だな。→このバグはすぐとれた。test3b を追加して Red にしてから Green。7章再開。
# うんの [状態を引き回すには、状態モナドがいいのかなとなんとなく思うんだけど、はてな? 自分の引き出しに状態モナドが入っていな..]
# うんの [あまり自分でつかう機会がなかった、fold は、今回よくつかっている。オレオレ再帰関数ではなく、適切に fold し..]
# うんの [ためしに、tdiary.conf で @secure = true にしてみた。 どうだ?]