トップ 追記

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|

2014-07-28 (Mon)

つぶやき URL

携帯電話で文字を打つのが面倒で、「ドロリッチなう」できないという瑣末な悩みがあったのですが、こういうURL を使えばいいようだ。

最近、ドロリッチ飲まないんですが。


2014-07-19 (Sat)

つぶやき

Tiger in Haskell のコンパイルに -Wall つけたら、おびただしい数の警告が。


はじめから -Wall つけておくべきだったか。
新しく書くコードでは警告でないように。すでに書いたコードからも、すこしずつ警告の数は減らしていこう。


8章は、もうひととおり読んだので、 canon.sml を Canon.hs へ翻訳写経する。
これから書くコードは -Wall でも警告でないように。


[Tiger][Haskell] chap7 中間コードへの変換

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}}])

以下の問題はいずれも直ってる:

  • 一次変数番号が重複していた
  • パラメータ変数の access をまちがっていた
  • L3 にあたる fragments が消えてしまっていた

また、

$ 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章にすすもう。


2014-07-18 (Fri)

つぶやき

今日は、サンチャにいくのである


@c_nyan せんせいの写真が追加された!(どこに?)


こないだのドック、1週間ながびいた夏風邪の最中にうけたんだよなぁ。なおったかなと思ってたけど、そのあとぶり返した。
白血球がどうの。


よく風邪はひくので、やだなと思うけど、
なんじゃかんじゃで治るってところがすばらしい。


休ませておけば治るような機械を、自分の体以外には持っていない。


サンチャってどこだ?


溝口から田園都市線か。


夏風邪ながびいたときに、ずっとマスクしてて(寝る時も)、そのときに耳のところかぶれたのが治らない。
メガネのツルがあたるので、かぶれてる場所にストレスかかりっぱなし。


メガネのツルをアルコール消毒してみた。


もういっこの問題もわかった(Str "L3" はどこへ行った問題)


https://github.com/unnohideyuki/Tiger-in-Haskell/blob/c7c03b76c16d8dfda8d56645687e3413d055518c/chap7/src/Semant.hs#L214
frgs じゃなくて frgs' を返すべきだった(それをしてないので、SeqExp 評価ないでつくられた String Fragment が捨てられてる)


temp やら frgs やら level やらの状態を引数わたししているから、こんな風にバグる。
なんらかの Monad m => m ExpTy にして、「配管」を隠し、引き回しは bind に任せるべきだ。


Tiger Compiler はこのままいこう。
つぎにコンパイラつくるときには、状態をもつ木変換にはモナドつかう。

本日のツッコミ(全1件) [ツッコミを入れる]

# うんの [tempもだ]


2014-07-17 (Thu)

[Tiger][Haskell] まだ chap7 だよ

https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7

今日は(あ、もう日付変わってる!)、帰ってくるの遅くなってしまって、痛恨。
static link の扱いあたりを追加してみたけど、動作がいろいろおかしい。

$ ./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}},
 Proc {body = EXP (CALL (NAME "L0_do_nothing1") [TEMP 2,MEM (BINOP PLUS (CONST (-3)) (TEMP 2)),NAME "L2"]), 
       frame = Frame {name = "L1_do_nothing2", formals = [InFrame (-3),InReg 2], locals = [], fp = 2}},
 Str "L2" "str",
 Proc {body = EXP (CALL (NAME "L1_do_nothing2") [TEMP 1,BINOP PLUS (MEM (BINOPPLUS (CONST (-3)) (TEMP 1))) (CONST 1)]), 
      frame = Frame {name = "L0_do_nothing1", formals = [InFrame (-3),InReg 2,InReg 1], locals = [], fp = 1}}
])
  • do_nothing2(a+1) の 1 は InReg 1 のはずが InFrame(-3) になってる。
  • Frame の formals に sl つむ必要なかった?あと、逆順?
  • おなじ番号の一時変数が複数ある?
  • L3 ラベルの Str フラグメントがないんだが。
  • static_link として渡すのは、古い fp でよかったんだよなぁ?

落ちついてコードを追ってみよう。

そして、いまなお文字列比較まわりは未実装。

つぶやき

https://www.google.com/fonts/specimen/Noto+Sans
"No 豆腐" で Noto だったのか。(Adobe からは Source Han Sans)


Arrows Me 上でついった見てると、よく見かける気がする、豆腐。
(フォントなに選んでたかな?)


つかれてんのかな、「めばちこ」っぽい。めやにが…


MHonARC の mhmimetypes.pl に xlsx, pptx, docx に関するものがなかったので、足した。
どこかにメモっておかねば。(これは仕事の話)


やっぱ、よく考えずにつぶやくの、よくなかった。(知ってた)


ひとつ原因がわかった。
https://github.com/unnohideyuki/Tiger-in-Haskell/blob/c7c03b76c16d8dfda8d56645687e3413d055518c/chap7/src/DalvikFrame.hs#L29

    (F.InFrame (-3 - n) : acc, temp)

ここの temp は t じゃないとだめ。このせいで、かならず formals の最初(static_link はいつも escapes)で temp が先祖がえりしてた。 
平気で変数を shadow してる命名がよくない気がした。


Str "L3" はどこへ行った問題が未だ。
frame の formals には static_link を積んだのに、それを用いる側でそれを考慮できてない問題もまだ。


-fwarn-name-shadowing なのかな。-Wall つけるか。最初は大変そう。いまのうち、ではあるか。
http://www.kotha.net/ghcguide_ja/7.0.4/options-sanity.html


frame の formals には static_link を積んだのに、それを用いる側でそれを考慮できてない問題

わかった。

https://github.com/unnohideyuki/Tiger-in-Haskell/blob/c7c03b76c16d8dfda8d56645687e3413d055518c/chap7/src/Semant.hs#L645

(_:as) = TL.acc_formals lev

こう直して、static_link の access を捨てればいい。(なんかイマイチの方法ではあるが)

気付いている問題は、あといっこか。> Str "L3" どこ?


週4回、夜だけのプログラミングでは、なかなか進まないけど、自分が書いたコードがわかんなくなるほど間はあかないので、
なんとか少しずつだが進めることができる。


「遅い」と「進まない」はチガウのが実感できて、ちょっとうれしい。


今日はコーディングしない日なので、気づいた直し方については、つぶやくだけ。明日やる。


2014-07-16 (Wed)

つぶやき

水曜なのに、おそく帰ってきてしまい、しょっく。
今日はもう1時間くらいしかない。


今日は、Let it go の movie をヘビロテ気味に視聴。
これが、シナリオ書き換えまで引き起こしたという歌かーとか思いつつ。


The cold never bothered me anyway.
定冠詞だなーとは思ったけど、よく見ると過去形だったのか。


let it go は、雪の結晶が自己相似形である点について高らかにシャウトしていてすばらしいと思います(konami


Fractal には、自己相似形みたいな数学的なニュアンスを含まない、日常的な意味が先にある(あった)のかな。
すこし調べてみたけど、わかんない。


さいきん、VMPlayer 起動すんのがめんどくさくて、家でも会社でも、ぜんぜんつかってない。
もっぱら、Haskell Platform for Windows.


ターミナルがまともじゃなくて、ときどき萎える。
たまに Mac book がうらやましい。


Source Han Sans 素敵っぽい
同じ字でも言語ごとに異なる字体を用意してあるとか。


アドビは、デジタルエクスペリエンスを通じて世界を変えようとしており…
http://blog.typekit.com/alternate/source-han-sans-jp/

本日のツッコミ(全2件) [ツッコミを入れる]

# うんの [思ったことをすぐに書くのは、自分の能力にマッチしてなかったようだし、 このやり方のほうがいいかも。 日毎にまとま..]

# うんの [つか、もう23時!! 貴重な、はすける夜なのに!!]


2014-07-14 (Mon)

つぶやき

すっかり習慣化していたようなことでも、ある日ぴたりとやめることは、案外簡単かも。
「上手につきあう」よりは、よほど。


Ask, or it will not be given to you.


つまり、「本当はそう願っているだけ♪」ではいけないな、と。


「きゃりーは日本民族の誇り」、ワーナー会長が語る快挙
http://business.nikkeibp.co.jp/article/interview/20140711/268522/

それ、きゃりーぱみゅぱみゅと ystk がすごいという話であって、「日本」に広げるの無理では。


「プログラミング言語の基礎概念」読みたいので、買うか悩む。
買っても積んどくだけちゃうんかという点で。


これ以上、積むだけのために本を買いたくない。


短期目標は、Pretty Print を会得する、かな。


RWH では、べつに Pretty Print ライブラリに言及してないのか。


Text.PrettyPrint が簡単/便利すぎて感動する暇がなかった


Haskell はハードタブの幅を 8 だと思って処理するが、F# だったかな、は 4 だと思っているらしい。
これは、Unix 文化か Windows 文化か、という話らしいのだが、
「ハードタブつかうな」で済む話でもあるような。Haskeller はつかわないので、あんまりピンとこない。

[Haskell] パターンマッチ

The implementation of functional programming language の 5 章、Efficient Compilation of pattern-matching を読みながら、パターンコンパイラのお試しコードを書いてみた。

ファイルはこちら:Patterns.hs

demo1

たとえば、

mappairs f [] ys = []
mappairs f (x:xs) [] = []
mappairs f (x:xs) (y:ys) = f x y : mappairs f xs ys

↑これは、こうなる↓

-- demo1
case xs' of
  Nil  ->
      []
  Cons x xs ->
      case ys' of
            Nil  -> []
            Cons y ys ->
                    f x y : mappairs f xs ys

demo3

nodups [] = []
nodups [x] = []
nodups (y:x:xs) = if y == x then nodups (x:xs) else y:nodups (x:xs)

↑これは、こうなる↓

-- demo3
case xs'' of
  Nil  ->
      []
  Cons x' xs' ->
      case xs' of
            Nil  -> [ x' ]
            Cons x xs ->
                    if x' == x then nodups ( x : xs ) else x' : nodups ( x : xs )

demo 4

case e of
  [x,True] -> x
  [False] -> True
  z -> False

↑これは、こうなる↓んだけど、あってんのかなぁ。

-- demo4
case e of
  Nil  ->
      False
  Cons _u2 _u3 ->
      case _u3 of
            Nil  -> case _u2 of
                              True  ->    False
                              False  ->   case _u3 of   Nil  ->         True
                                                        Cons _u4 _u5 -> False


            Cons _u4 _u5 ->
                    case _u4 of
                              True  ->    case _u5 of   Nil  ->         _u2
                                                        Cons _u6 _u7 -> case _u2 of       True  ->            False
                                                                                          False  ->           case _u3 of           Nil  ->                 True
                                                                                                                                    Cons _u4 _u5 ->         False



                              False  ->   case _u2 of   True  ->        False
                                                        False  ->       case _u3 of       Nil  ->             True
                                                                                          Cons _u4 _u5 ->     False

demo 5

foo True = 1 -- missing a pattern for False

↑これは、こう↓

-- demo5
case _u1 of
  True  ->
      1
  False  ->
      error

まだ、しっくり理解できているわけじゃなくて、とりあえず動くコードを書いてみた段階。
また、オーバーラップのあるパターンの対処はしてない (demo 2 がとばされているのは、そのため)。

[Haskell][Tiger] chap7

Formal Parameters の access をきちんと処理するようにして、これで終わりかなと思ったら…

  • Static Link つみ忘れ
  • String の比較

の2つがすくなくとも積み残し。ノートに書いてあったのに。

本日のツッコミ(全3件) [ツッコミを入れる]

# うんの [パターンマッチのコンパイル前後で等価になっているかどうかは、Quickcheck を用いたテストができるような気がし..]

# うんの [> Quickcheck を用いたテスト こんな感じかな。こりゃいいや。 http://uhideyuki...]

# うんの [感想: QuickCheck すげぇ。]


2014-07-11 (Fri)

[Tiger][Haskell] chap7 終わり…かけ

https://github.com/unnohideyuki/Tiger-in-Haskell/tree/master/chap7

うーん、もうちょいか。

テストというか、動作確認はぼちぼちやりつつ、8章に進んでもいいかな。

といいつつ、明らかな誤りや未実装もあり。

  • STRING 比較
  • ここ の E.Access に値がはいってない
  • callExp で、static link を積んでません

あと、そろそろ pretty print ほしい。Real World Haskell に書いてあったの、読もう。


2014-07-10 (Thu)

[Haskell][ Tiger] chap7 まだつづく。パターンマッチ

7章まだ終わんなかった。あらかた終わった気がしてるけど。
テストはまだ、これから。

あ、それと、Haskell のパターンマッチコンパイラを、Haskell で書いたんだった。Miranda で書かれたやつを移植。


2014-07-07 (Mon)

[Tiger][Haskell] chap7 まだつづき

少し間が空いてしまった。まだ7章。

https://github.com/unnohideyuki/Tiger-in-Haskell

Frame.Frag を定義、Semant.transDec では [TL.Exp] や [Frame.Frag] を出力するようにし、LetExp の処理では [TL.Exp] を変数初期化式として用いるように。

[Frags] は、transDec の出力に加えるだけでは不十分で、transExp, transDec がつねに引き回さないといけない(状態)。

つぎは、[Frags] を状態として引き回す改造から、ソース部分としてのつづきは trexp for ArrayExp のあたりから続き。

また、Alex で Unicode を扱う方法についても、少し調べた。

Alex 3.x では UTF-8 を自然に扱えるようになっている。GHC のコードでは、Alex 2.x との互換性のために、getChar のなかで種別を判定して、種別ごとに「つぶした」値を返すようなトリックが用いられている。

Alex 3.x では、そのようなトリックは使わなくてもいいが、$uniwhite などを自前で定義してやらないといけない。

手で書いてはいられないので、生成するプログラムを書いた。
(unicateg.hs, まだローカルにしかない)

Lex.x にコピペで埋め込むのは可読性を下げるので、include しよう。少し不本意だけど cpp -P する。


2014-06-28 (Sat)

[Haskell][Tiger] chap7 コーディング中…

Modern Compiler Implementation in ML を "in Haskell" に変えてやるの続行中なんですが。

7章は、本文の記述量と、プログラミング量の乖離が結構はげしい章なんじゃあるまいか。けっこう時間がかかってて、読むのは8章にすすんでいるのに、コーディングはまだ 7 章。

Semant 改造中で、RecordExp のところを書き直そうとして、バグに気づいてしまった(6章で見逃した潜在バグ)。

レコード定義で、各フィールドの定義が、フィールド宣言の順番どおりにならんでいることが前提になってるかのようなコーディングになってしまっている。

6章に戻ってバグとってから、再開だな。→このバグはすぐとれた。test3b を追加して Red にしてから Green。7章再開。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|
Categories Tiger | 3imp | Card | Cutter | Dalvik | Football | GAE/J | Haskell | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声