From fc08f05feae4bd090dab51c78dbcbf3404a70f3e Mon Sep 17 00:00:00 2001 From: Ian Adam Naval Date: Fri, 24 Feb 2017 10:46:23 -0500 Subject: [PATCH] Implement emojifuck --- examples/helloworld.bf | 33 ------------------------------ examples/helloworld.ef | 1 + src/{brainfuck.hs => emojifuck.hs} | 28 ++++++++++++------------- 3 files changed, 15 insertions(+), 47 deletions(-) delete mode 100644 examples/helloworld.bf create mode 100644 examples/helloworld.ef rename src/{brainfuck.hs => emojifuck.hs} (91%) diff --git a/examples/helloworld.bf b/examples/helloworld.bf deleted file mode 100644 index 7c2ccc9..0000000 --- a/examples/helloworld.bf +++ /dev/null @@ -1,33 +0,0 @@ -+++++ +++ Set Cell #0 to 8 -[ - >++++ Add 4 to Cell #1; this will always set Cell #1 to 4 - [ as the cell will be cleared by the loop - >++ Add 4*2 to Cell #2 - >+++ Add 4*3 to Cell #3 - >+++ Add 4*3 to Cell #4 - >+ Add 4 to Cell #5 - <<<<- Decrement the loop counter in Cell #1 - ] Loop till Cell #1 is zero - >+ Add 1 to Cell #2 - >+ Add 1 to Cell #3 - >- Subtract 1 from Cell #4 - >>+ Add 1 to Cell #6 - [<] Move back to the first zero cell you find; this will - be Cell #1 which was cleared by the previous loop - <- Decrement the loop Counter in Cell #0 -] Loop till Cell #0 is zero - -The result of this is: -Cell No : 0 1 2 3 4 5 6 -Contents: 0 0 72 104 88 32 8 -Pointer : ^ - ->>. Cell #2 has value 72 which is 'H' ->---. Subtract 3 from Cell #3 to get 101 which is 'e' -+++++ ++..+++. Likewise for 'llo' from Cell #3 ->>. Cell #5 is 32 for the space -<-. Subtract 1 from Cell #4 for 87 to give a 'W' -<. Cell #3 was set to 'o' from the end of 'Hello' -+++.----- -.----- ---. Cell #3 for 'rl' and 'd' ->>+. Add 1 to Cell #5 gives us an exclamation point ->++. And finally a newline from Cell #6 diff --git a/examples/helloworld.ef b/examples/helloworld.ef new file mode 100644 index 0000000..29aded2 --- /dev/null +++ b/examples/helloworld.ef @@ -0,0 +1 @@ +📈📈📈📈📈📈📈📈🌔🔜📈📈📈📈🌔🔜📈📈🔜📈📈📈🔜📈📈📈🔜📈🔙🔙🔙🔙📉🌖🔜📈🔜📈🔜📉🔜🔜📈🌔🔙🌖🔙📉🌖🔜🔜📤🔜📉📉📉📤📈📈📈📈📈📈📈📤📤📈📈📈📤🔜🔜📤🔙📉📤🔙📤📈📈📈📤📉📉📉📉📉📉📤📉📉📉📉📉📉📉📉📤🔜🔜📈📤🔜📈📈📤 \ No newline at end of file diff --git a/src/brainfuck.hs b/src/emojifuck.hs similarity index 91% rename from src/brainfuck.hs rename to src/emojifuck.hs index 07deb23..0dc4b1d 100644 --- a/src/brainfuck.hs +++ b/src/emojifuck.hs @@ -1,6 +1,5 @@ --- Branfuck interpreter in Haskell: beause why not +-- Emojifuck interpreter in Haskell: beause why not -- author: ianonavy --- Based on https://github.com/quchen/articles/blob/master/write_yourself_a_brainfuck.md import Data.Maybe import Data.List @@ -22,16 +21,17 @@ data BFSource = BFSource [BrainfuckCommand] instance Show BFSource where show (BFSource bfs) = map bfToChar bfs where - bfToChar GoRight = '>' - bfToChar GoLeft = '<' - bfToChar Increment = '+' - bfToChar Decrement = '-' - bfToChar Print = '.' - bfToChar Read = ',' - bfToChar LoopL = '[' - bfToChar LoopR = ']' - bfToChar (Comment c) = c + bfToChar GoRight = '\128284' + bfToChar GoLeft = '\128281' + bfToChar Increment = '\128200' + bfToChar Decrement = '\128201' + bfToChar Print = '\128229' + bfToChar Read = '\128228' + bfToChar LoopL = '\127764' + bfToChar LoopR = '\127766' +-- bfToChar (Comment c) = c +-- data Tape a = Tape [a] -- Left of the pivot element a -- Pivot element [a] -- Right of the pivot element @@ -64,7 +64,7 @@ traceParens :: BFSource -> [Int] traceParens (BFSource bfs) = scanl accParens 0 bfs getMissingOpenError :: BFSource -> String -getMissingOpenError (BFSource bfs) = +getMissingOpenError (BFSource bfs) = "Syntax Error:\n- Close parens without open paren: character " ++ index where index = (show . fromJust . findIndex (<0) $ scanl accParens 0 bfs) @@ -89,7 +89,7 @@ parseBrainfuck = checkSyntax . BFSource . mapMaybe charToBF charToBF ']' = Just LoopR charToBF c = Just (Comment c) -printBrainfuck :: Either String BFSource -> IO () +printBrainfuck :: Either String BFSource -> IO () printBrainfuck (Left bfs) = putStrLn bfs printBrainfuck (Right bfs) = putStrLn . show $ bfs @@ -176,4 +176,4 @@ runFile filename = readFile filename >>= runBrainfuck . parseBrainfuck main = do args <- getArgs mapM runFile args - \ No newline at end of file +