/bf2clj.clj

https://github.com/takano32/brainfuck · Clojure · 58 lines · 41 code · 15 blank · 2 comment · 10 complexity · 50975942645680b2966e10eed27b33ca MD5 · raw file

  1. ;; #!/usr/bin/env clj
  2. ;; convert from Clojure to Brainfuck
  3. (defn stdin []
  4. (line-seq
  5. (java.io.BufferedReader. *in* )))
  6. (def pointer 0)
  7. (defn init-print []
  8. (println "
  9. (def pointer 0)
  10. (defn memoryname [] (str \"m\" pointer))
  11. (defn get-value-from-memory []
  12. (eval (symbol (memoryname))))
  13. (defn inc-pointer
  14. [] (def pointer (+ pointer 1)))
  15. (defn dec-pointer
  16. [] (def pointer (- pointer 1)))
  17. (defn set-memory? []
  18. (boolean (resolve (symbol (memoryname)))))
  19. (defn set-or-zero []
  20. (if (set-memory?) (get-value-from-memory) 0))
  21. (defn set-pointer [set-value]
  22. (intern *ns* (symbol (memoryname)) set-value))
  23. (defn inc-memory [] (set-pointer (+ (set-or-zero) 1)))
  24. (defn dec-memory [] (set-pointer (- (set-or-zero) 1)))
  25. "))
  26. (defn clojurefuck
  27. [token]
  28. (do
  29. (cond
  30. (= token \[) (println "
  31. ((fn []
  32. (loop []
  33. (if (> (set-or-zero) 0) (do ")
  34. (= token \]) (println "(recur)) nil))))")
  35. (= token \+) (println "(inc-memory)")
  36. (= token \-) (println "(dec-memory)")
  37. (= token \>) (println "(inc-pointer)")
  38. (= token \<) (println "(dec-pointer)")
  39. (= token \.) (println "(print (char (set-or-zero)))")))
  40. )
  41. (init-print)
  42. (doall
  43. (map clojurefuck (str (stdin))))