海野秀之(うんのひでゆき)の外部記憶
Twitter (twilog) / RSS / アンテナ / ぶくま
Tiger in Haskell のコンパイルに -Wall つけたら、おびただしい数の警告が。
はじめから -Wall つけておくべきだったか。
新しく書くコードでは警告でないように。すでに書いたコードからも、すこしずつ警告の数は減らしていこう。
8章は、もうひととおり読んだので、 canon.sml を Canon.hs へ翻訳写経する。
これから書くコードは -Wall でも警告でないように。
https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7
きのう、おととい気づいた修正をやって、さらに、文字列比較を実装。
$ cat ../testcases/test6.tig
/* define valid mutually recursive procedures */
let
function do_nothing1(a: int, b: string)=
do_nothing2(a+1)
function do_nothing2(d: int) =
do_nothing1(d, "str")
in
do_nothing1(0, "str2")
end
↑の処理結果は、こうなった↓(すこし手で整形してる)
$ ./driver.exe < ../testcases/test6.tig
(UNIT,[Proc {body = EXP (ESEQ (EXP (CONST 0)) (CALL (NAME "L0_do_nothing1") [TEMP 0,CONST 0,NAME "L3"])),
frame = Frame {name = "main", formals = [InFrame (-3)], locals = [], fp = 0}},
Str "L3" "str2",
Proc {body = EXP (CALL (NAME "L0_do_nothing1") [TEMP 5,TEMP 4,NAME "L2"]),
frame = Frame {name = "L1_do_nothing2", formals = [InFrame (-3),InReg 4], locals = [], fp = 5}},
Str "L2" "str",
Proc {body = EXP (CALL (NAME "L1_do_nothing2") [TEMP 3,BINOP PLUS (TEMP 2) (CONST 1)]),
frame = Frame {name = "L0_do_nothing1", formals = [InFrame (-3),InReg 2,InReg 1], locals = [], fp = 3}}])
以下の問題はいずれも直ってる:
また、
$ cat ../additonalcases/teststrcmp.tig
"ab" > "cd"
↑これは、↓こうなるようにしてみた。
$ ./driver.exe < ../additonalcases/teststrcmp.tig
(INT,[Proc {body = EXP (ESEQ (SEQ (CJUMP GT (CALL (NAME "_strcmp") [NAME "L0",NAME "L1"]) (CONST 0) "L2" "L2") (LABEL "L2")) (CONST 0)),
frame = Frame {name = "main", formals = [InFrame (-3)], locals = [], fp = 0}},
Str "L1" "cd",
Str "L0" "ab"])
results.log はボチボチ確認していくこととして、8章にすすもう。