Skip to content

Commit

Permalink
implements go version except getc
Browse files Browse the repository at this point in the history
  • Loading branch information
stmtk1 committed May 30, 2018
1 parent f206ec8 commit 442d7f7
Show file tree
Hide file tree
Showing 2 changed files with 125 additions and 0 deletions.
123 changes: 123 additions & 0 deletions brain_go.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,123 @@

{-# LANGUAGE QuasiQuotes #-}

module Brain_go where
import Control.Applicative
import Str

before_main = [str|
package main

import(
"fmt"
//"strings"
)

type TuringTape struct {
tape []byte
head int
}

func create() TuringTape {
ret := TuringTape{}
ret.tape = make([]byte, 1000)
for i := 0; i < 1000; i++ {
ret.tape[i] = 0
}

ret.head = 0
return ret
}

func increment(a TuringTape) TuringTape {
a.tape[a.head]++
return a
}

func decrement(a TuringTape) TuringTape {
a.tape[a.head]--
return a
}

func next_var(a TuringTape) TuringTape {
a.head++
if len(a.tape) <= a.head {
new_tape := make([]byte, len(a.tape) + 1000)
for i := 0; i < len(new_tape); i++ {
if i < len(a.tape) {
new_tape[i] = a.tape[i]
}else {
new_tape[i] = 0
}
}
a.tape = new_tape
}
return a
}

func prev_var(a TuringTape) TuringTape {
a.head--
if a.head < 0 {
new_tape := make([]byte, len(a.tape) + 1000)
for i := 0; i < len(new_tape); i++ {
if i < 1000 {
new_tape[i] = 0
}else {
new_tape[i] = a.tape[i - 1000]
}
}
a.tape = new_tape
a.head += 1000
}
return a
}

func print_var(a TuringTape) TuringTape {
fmt.Printf("%c", a.tape[a.head])
return a
}

func get_var(a TuringTape) TuringTape {
return a
}

|]

convert_brainfuck :: String -> String
convert_brainfuck "" = ""

convert_brainfuck ('+':rest) = "a = increment(a)\n" ++ convert_brainfuck rest
convert_brainfuck ('-':rest) = "a = decrement(a)\n" ++ convert_brainfuck rest
convert_brainfuck ('>':rest) = "a = next_var(a)\n" ++ convert_brainfuck rest
convert_brainfuck ('<':rest) = "a = prev_var(a)\n" ++ convert_brainfuck rest
convert_brainfuck ('.':rest) = "a = print_var(a)\n" ++ convert_brainfuck rest
-- convert_brainfuck (',':rest) = " get_var()\n" ++ convert_brainfuck rest
convert_brainfuck ('[':rest) = " for a.tape[a.head] != 0 {\n" ++ convert_brainfuck rest
convert_brainfuck (']':rest) = "}\n" ++ convert_brainfuck rest
convert_brainfuck (_:rest) = convert_brainfuck rest

{-
convert_brainfuck ('+':rest) = " increment" ++ convert_brainfuck rest
convert_brainfuck ('-':rest) = " decrement" ++ convert_brainfuck rest
convert_brainfuck ('>':rest) = " next_var" ++ convert_brainfuck rest
convert_brainfuck ('<':rest) = " prev_var" ++ convert_brainfuck rest
convert_brainfuck ('.':rest) = " print_var" ++ convert_brainfuck rest
convert_brainfuck (',':rest) = " get_var" ++ convert_brainfuck rest
convert_brainfuck ('[':rest) = " (loop_func" ++ convert_brainfuck rest
convert_brainfuck (']':rest) = ")" ++ convert_brainfuck rest
-}

create_main :: String -> String
create_main input = "func main(){\nvar a TuringTape = create()\n" ++ (convert_brainfuck input) ++ "}"


create_program :: String -> String
create_program input = before_main ++ (create_main input)

--brainfuck :: String
--brainfuck = ">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++."
--brainfuck = ">+++++++++[<.++++++++>-]<>+++++++[<++++>-]<+++++++++++[-]>++++++++[<++++>-]<>+++++++++++[<+++++>-]<>++++++++[<+++>-]<+++--------------[-]>++++++++[<++++>-]<+[-]++++++++++"
--brainfuck = ">+++++++++[<++++++++>-.]<."
--brainfuck = "-.>.<.<.>>>>."

--main = putStrLn $ create_program brainfuck
2 changes: 2 additions & 0 deletions main.hs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import Brain_py
import Brain_java
import Brain_clj
import Brain_php
import Brain_go

main :: IO ()
main = do
Expand Down Expand Up @@ -45,3 +46,4 @@ convert bf "python" = Brain_py.create_program bf
convert bf "java" = Brain_java.create_program bf
convert bf "clojure" = Brain_clj.create_program bf
convert bf "php" = Brain_php.create_program bf
convert bf "go" = Brain_go.create_program bf

0 comments on commit 442d7f7

Please sign in to comment.