aboutsummaryrefslogtreecommitdiff
path: root/Brainfuck.icl
diff options
context:
space:
mode:
Diffstat (limited to 'Brainfuck.icl')
-rw-r--r--Brainfuck.icl37
1 files changed, 18 insertions, 19 deletions
diff --git a/Brainfuck.icl b/Brainfuck.icl
index ca7d7d1..009b907 100644
--- a/Brainfuck.icl
+++ b/Brainfuck.icl
@@ -25,16 +25,17 @@ implementation module Brainfuck
import StdEnv
instance == Command where
- (==) INC INC = True
- (==) DEC DEC = True
- (==) INCP INCP = True
- (==) DECP DECP = True
- (==) OUT OUT = True
- (==) IN IN = True
- (==) IFZ IFZ = True
- (==) IFNZ IFNZ = True
- (==) _ _ = False
+ == INC INC = True
+ == DEC DEC = True
+ == INCP INCP = True
+ == DECP DECP = True
+ == OUT OUT = True
+ == IN IN = True
+ == IFZ IFZ = True
+ == IFNZ IFNZ = True
+ == _ _ = False
+// Run a program
run :: Program *env -> *env | FileSystem env
run p world = run` p 0 0 [0,0..] world
where
@@ -62,18 +63,18 @@ where
| not ok = abort "Couldn't close stdio"
| otherwise = run` p (iptr + 1) dptr t world
where
- cast :: Cell -> Cell
- cast n
+ convert :: Cell -> Cell
+ convert n
| n < 0 = 0
| n > 255 = 255
| otherwise = n
apply :: Command DataPointer Tape -> Tape
- apply INC dptr t = (take dptr t) ++ [cast (t!!dptr + 1)] ++ (drop (dptr + 1) t)
- apply DEC dptr t = (take dptr t) ++ [cast (t!!dptr - 1)] ++ (drop (dptr + 1) t)
+ apply INC dptr t = update t dptr (t!!dptr + 1)
+ apply DEC dptr t = update t dptr (t!!dptr - 1)
- update :: Tape DataPointer Char -> Tape
- update t ptr c = (take ptr t) ++ [fromChar c : drop (ptr + 1) t]
+ update :: Tape DataPointer a -> Tape | toInt a
+ update t ptr c = (take ptr t) ++ [convert (toInt c) : drop (ptr + 1) t]
forward` :: Program InstrPointer Int -> InstrPointer
forward` _ ptr 0 = ptr
@@ -95,8 +96,9 @@ where
backward :: Program InstrPointer -> InstrPointer
backward p ptr = backward` p (ptr-1) 1
+// Read a string into a program
read :: String -> Program
-read s = [readC c \\ c <- sanitize (fromString s)]
+read s = [readC c \\ c <- fromString s | isMember c ['>','<','+','-','.',',','[',']']]
where
readC :: Char -> Command
readC '>' = INCP
@@ -107,6 +109,3 @@ where
readC ',' = IN
readC '[' = IFZ
readC ']' = IFNZ
-
- sanitize :: [Char] -> [Char]
- sanitize cs = [c \\ c <- cs | isMember c ['>','<','+','-','.',',','[',']']]