BrainF*ckインタプリタを作る(2)

今のままじゃテストするもの面倒なので,外部のファイルからプログラムを読み込めるようにした。
といっても手抜きで,命令列を頭から一直線に実行して無くなったら終わり。で,最後の状態を表示する。今のところはジャンプしたりはできないんだからこれでいいさ。

 module Main where
 
 import System
 
 
 (snip)
 
 
 bfEvaluate :: BrainF_ck -> [Char] -> BrainF_ck
 bfEvaluate = foldl eval
                where eval bf c = case c of
                                    '+' -> bfIncrement bf
                                    '-' -> bfDecrement bf
                                    '>' -> bfShift bf
                                    '<' -> bfUnshift bf
 
 
 main :: IO ()
 main = do args <- getArgs
           prog <- readFile $ head args
           print $ bfEvaluate bfInitial prog

サンプルのプログラムはこれ。

 ++>++>++<-

最初のレジスタを2回インクリメントして右にシフト,同じく2回インクリメントして右にシフト,また2回インクリメントしたら今度は左に1つシフト,1回デクリメントして終わり。
結局,レジスタの値が左から 2,1,2 になって,ポインタは 1 (左から2番目を指している)になる。やってみよう。

 >type sample.bf
 ++>++>++<-
 >runghc hbf.hs sample.bf
 BF {bfPointer = 1, bfRegister = [2,1,2,0,0,0,0,0,0,0]}

OK。