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