エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

計算機

最初にパーサを書くのが正当なような気がするものの。先に内部表現を書いてしまうのが「あ、やっぱりオレだ」と思う瞬間。昔、インタプリタを書いたときもそうだったっけ。

data Elem = Plus | Minus | Times | Divide | Value Int

calc :: [Elem] -> Int
calc es = calc' es []
  where
    calc' :: [Elem] -> [Int] -> Int
    calc' []             [n]      = n
    calc' ((Value n):es) ns       = calc' es (n:ns)
    calc' (Plus:es)      (n:m:ns) = calc' es ((m + n):ns)
    calc' (Minus:es)     (n:m:ns) = calc' es ((m - n):ns)
    calc' (Times:es)     (n:m:ns) = calc' es ((m * n):ns)
    calc' (Divide:es)    (n:m:ns) = calc' es ((m `div` n):ns)

main = do
    print $ calc [Value 10, Value 4, Times, Value 20, Divide] -- 逆ポーランド(10 4 * 20 /)になってます