aboutsummaryrefslogtreecommitdiff
path: root/Brainfuck.icl
diff options
context:
space:
mode:
Diffstat (limited to 'Brainfuck.icl')
-rw-r--r--Brainfuck.icl18
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