トップ «前の日記(2014-08-20 (Wed)) 最新 次の日記(2014-09-12 (Fri))» 編集

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|08|09|12|
2015|01|02|03|04|

2014-09-10 (Wed)

[Tiger][Haskell] 9 章の Code Generater 書き始め

ようやく、State Monad (書いたことないので)恐怖症を克服し、munchExp を State Monad として書き始めた。やっぱこうだよな。適切なツールをつかってる実感というか、快適な感じ。

https://github.com/unnohideyuki/Tiger-in-Haskell/blob/0cb0fced97e0c07912b6206493336739b56daf05/chap9/src/Codegen.hs

ただ、書いて、寝てみて、もっとうまく書けるよなと思った(寝ながら)。

munchExp (T.STR s) =
  state $ \st ->
  let
    insts = get_insts st
    temp = get_temp st
    (t, temp') = Temp.newTemp temp
    inst = A.strInstr s [t]
  in
   (t, st{get_insts=insts ++ [inst], get_temp=temp'})

これは、次のように書き直したい:

munchExp (T.STR s) =
  do
    t <- newTemp
    emit $ A.strInstr s [t]
    return t

こう書けるように、newTemp :: State CgenState Temp.Temp や、emit :: State CgenState () を書くのだろう。"emit" という単語は、Tiger book がそういうボキャブラリなので。(状態の型も名前を変えよう> CgenState)

これで、より State Monad っぽい書き方になったかなぁとは思うんだけど…。聞くところによると、「do 記法は有害だから使うな」という説もあるらしいのが、ちょっとだけ気になってる。

ま、いいか。


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|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声