Execute Brain****/Janet: Difference between revisions

From Rosetta Code
Content added Content deleted
(Created page with "{{implementation|Brainf***}}{{collection|RCBF}} <lang Clojure>(defn clean [src] (def valid (zipcoll "[],.+-<>" (range 8))) (filter valid src)) (defn make-jumps [insns]...")
 
m (Fixed syntax highlighting.)
 
Line 1: Line 1:
{{implementation|Brainf***}}{{collection|RCBF}}
{{implementation|Brainf***}}{{collection|RCBF}}
<lang Clojure>(defn clean [src]
<syntaxhighlight lang="clojure">(defn clean [src]
(def valid (zipcoll "[],.+-<>" (range 8)))
(def valid (zipcoll "[],.+-<>" (range 8)))
(filter valid src))
(filter valid src))
Line 32: Line 32:
(let [insns (clean (slurp ((dyn :args) 1)))
(let [insns (clean (slurp ((dyn :args) 1)))
jumps (make-jumps insns)]
jumps (make-jumps insns)]
(interpret insns jumps))</lang>
(interpret insns jumps))</syntaxhighlight>
{{out}}
{{out}}
<pre>$ echo Wnarg | janet bf.janet rot13.bf
<pre>$ echo Wnarg | janet bf.janet rot13.bf

Latest revision as of 11:30, 1 September 2022

Execute Brain****/Janet is an implementation of Brainf***. Other implementations of Brainf***.
Execute Brain****/Janet is part of RCBF. You may find other members of RCBF at Category:RCBF.
(defn clean [src]
  (def valid (zipcoll "[],.+-<>" (range 8)))
  (filter valid src))

(defn make-jumps [insns]
  (var stack @[])
  (var jumps @{})
  (eachp [i insn] insns
    (case insn
      (chr "[") (array/push stack i)
      (chr "]") (put jumps i (array/pop stack))))
  (merge jumps (invert jumps)))

(defn interpret [insns jumps]
  (def tape @{})
  (var dp 0)
  (var ip 0)
  (loop [insn :iterate (get insns ip)]
    (def cur (get tape dp 0))
    (case insn
      (chr "<") (-- dp)
      (chr ">") (++ dp)
      (chr "+") (set (tape dp) (inc cur))
      (chr "-") (set (tape dp) (dec cur))
      (chr ",") (set (tape dp) (if-let [c (:read stdin 1)] (c 0) -1))
      (chr ".") (prin (string/from-bytes (tape dp)))
      (chr "[") (if (= 0 cur) (set ip (jumps ip)))
      (chr "]") (if (not= 0 cur) (set ip (jumps ip))))
    (++ ip)))

(let [insns (clean (slurp ((dyn :args) 1)))
      jumps (make-jumps insns)]
  (interpret insns jumps))
Output:
$ echo Wnarg | janet bf.janet rot13.bf
Janet