diff options
Diffstat (limited to 'Brainfuck.icl')
-rw-r--r-- | Brainfuck.icl | 18 |
1 files changed, 8 insertions, 10 deletions
diff --git a/Brainfuck.icl b/Brainfuck.icl index 009b907..89f8407 100644 --- a/Brainfuck.icl +++ b/Brainfuck.icl @@ -42,7 +42,8 @@ where run` :: Program InstrPointer DataPointer Tape *env -> *env | FileSystem env run` p iptr dptr t world | iptr >= length p = world - | p!!iptr == INC || p!!iptr == DEC = run` p (iptr + 1) dptr (apply (p!!iptr) dptr t) world + | p!!iptr == INC || p!!iptr == DEC + = run` p (iptr + 1) dptr (apply (p!!iptr) dptr t) world | p!!iptr == INCP = run` p (iptr + 1) (dptr + 1) t world | p!!iptr == DECP = run` p (iptr + 1) (dptr - 1) t world | p!!iptr == IFZ && t!!dptr <> 0 = run` p (iptr + 1) dptr t world @@ -56,18 +57,15 @@ where | not ok = abort "Couldn't read input" # (ok,world) = fclose io world | not ok = abort "Couldn't close stdio" - | otherwise = run` p (iptr + 1) dptr (update t dptr c) world + = run` p (iptr + 1) dptr (update t dptr c) world // must be OUT now # io = io <<< toChar (t!!dptr) # (ok,world) = fclose io world | not ok = abort "Couldn't close stdio" - | otherwise = run` p (iptr + 1) dptr t world + = run` p (iptr + 1) dptr t world where convert :: Cell -> Cell - convert n - | n < 0 = 0 - | n > 255 = 255 - | otherwise = n + convert n = max 0 (min 255 n) apply :: Command DataPointer Tape -> Tape apply INC dptr t = update t dptr (t!!dptr + 1) @@ -81,14 +79,14 @@ where forward` p ptr i | p!!ptr == IFZ = forward` p (ptr+1) (i+1) | p!!ptr == IFNZ = forward` p (ptr+1) (i-1) - | otherwise = forward` p (ptr+1) i + = forward` p (ptr+1) i backward` :: Program InstrPointer Int -> InstrPointer backward` _ ptr 0 = ptr + 1 backward` p ptr i | p!!ptr == IFZ = backward` p (ptr-1) (i-1) | p!!ptr == IFNZ = backward` p (ptr-1) (i+1) - | otherwise = backward` p (ptr-1) i + = backward` p (ptr-1) i forward :: Program InstrPointer -> InstrPointer forward p ptr = forward` p (ptr+1) 1 @@ -98,7 +96,7 @@ where // Read a string into a program read :: String -> Program -read s = [readC c \\ c <- fromString s | isMember c ['>','<','+','-','.',',','[',']']] +read s = [readC c \\ c <- fromString s | isMember c ['><+-.,[]']] where readC :: Char -> Command readC '>' = INCP |