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。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください