haskell 入門
うーん、やっぱり haskell はまだ全く勉強不足。コンパイルを通すだけできつい。incremental に何か作れる気がまるでしないな。最初から定義を書き下せるくらいでないと。
以下、全く自信のない secd machine in haskell の途中。GHC 6.6 環境。
*Main> secd ([], [], [LDC 2, LDC 3, SUB, LDC 7, ADD], []) ([NUMBER 8],[],[],[])
data Inst = NIL | LDC Integer | NUMBER Integer | ADD | SUB | MUL | EQL | SEL | JOIN | BOOLEAN Bool | CONS | Insts [Inst] | LDF [Inst] | CLS [Inst] [Inst] | AP deriving (Eq, Show) secd :: ([Inst], [Inst], [Inst], [Inst]) -> ([Inst], [Inst], [Inst], [Inst]) secd (s, e, NIL:cs, d) = secd (NIL:s, e, cs, d) secd (s, e, (LDC n):cs, d) = secd ((NUMBER n):s, e, cs, d) secd (NUMBER a:NUMBER b:s, e, ADD:c, d) = secd (NUMBER (a + b):s, e, c, d) secd (NUMBER a:NUMBER b:s, e, SUB:c, d) = secd (NUMBER (a - b):s, e, c, d) secd (NUMBER a:NUMBER b:s, e, MUL:c, d) = secd (NUMBER (a * b):s, e, c, d) secd (NUMBER a:NUMBER b:s, e, EQL:c, d) = secd (BOOLEAN(a == b):s, e, c, d) secd (BOOLEAN x:s, e, SEL:Insts ct:Insts cf:c, d) = if x then secd (s, e, ct, Insts c:d) else secd (s, e, cf, Insts c:d) secd (s, e, JOIN:c, (Insts cr):d) = secd (s, e, cr, d) secd (s, e, c, d) = (s, e, c, d)