User:Feuermonster/Bf2Py

From Esolang
Jump to navigation Jump to search

Translates Brainfuck- to Pythoncode.

#!/usr/bin/stlisp

; Load some modules
(load "/usr/lib/stlisp/mod_io.so")

; Read text from file
(let (str-to-ls (extract (IO:read-all-text (IO "input.bf")))) "code")

; Output basic stuff
(print "import sys")
(print "tape = [0] * 32000")
(print "ptr = 16000")

(let (list nil) "spaces")

(def "put-spaces" '(` (let "put-spaces-p") (IO:put-str (IO (put-spaces-p))) ))

; Convert
(def "convert-bf" '(`
  (let "convert-bf-cur")
  (reduce "put-spaces" (spaces))
  (eq (convert-bf-cur) "+"
    '(IO:put-str-crlf (IO "tape[ptr] += 1"))
    '(`)
   )
   (eq (convert-bf-cur) "-"
     '(IO:put-str-crlf (IO "tape[ptr] -=  1"))
     '(`)
   )
   (eq (convert-bf-cur) "<"
     '(IO:put-str-crlf (IO "ptr -= 1"))
     '(`)
   )
   (eq (convert-bf-cur) ">"
     '(IO:put-str-crlf (IO "ptr += 1"))
     '(`)
   )
   (eq (convert-bf-cur) "["
     '(` (IO:put-str-crlf (IO "while tape[ptr] != 0:")) (let (cnat (list nil " ") (spaces)) "spaces") )
     '(`)
   )
   (eq (convert-bf-cur) "]"
     '(` (let (rest (spaces)) "spaces") (print "") )
     '(`)
   )
   (eq (convert-bf-cur) "."
     '(IO:put-str-crlf (IO "sys.stdout.write(chr(int(tape[ptr])))"))
     '(`)
   )
  )
 )

(reduce "convert-bf" (code))