got reading and evaling of operators working

This commit is contained in:
Richard Harrington 2013-07-28 15:00:05 -04:00
parent bab5171d80
commit f8c8d38ff2
2 changed files with 8 additions and 13 deletions

View File

@ -13,8 +13,10 @@
(def rc "AIM + 5 TO RADAR") (def rc "AIM + 5 TO RADAR")
(def rp (create/compile rc)) (def rp (create/compile rc))
(def rs (assoc-in (exec/init-robot rp) [:registers "AIM"] 6)) (def t0 (assoc-in (exec/init-robot rp) [:registers "AIM"] 6))
(def t0 (exec/tick-robot rs))
(def t1 (exec/tick-robot t0)) (def t1 (exec/tick-robot t0))
(def t3 (exec/tick-robot t1)) (def t2 (exec/tick-robot t1))
(def t3 (exec/tick-robot t2))
(def iter (iterate exec/tick-robot t0))

View File

@ -1,13 +1,12 @@
(ns rw.exec (ns rw.exec
(:require (rw [lexicon :as lexicon])) (:require (rw [lexicon :as lexicon])))
(:use [clojure.pprint :only [pprint]]))
(def op-map (zipmap lexicon/op-commands (def op-map (zipmap lexicon/op-commands
(map (fn [op] (map (fn [op]
(case op (case op
"/" #(int (Math/round (float (/ %1 %2)))) "/" #(int (Math/round (float (/ %1 %2))))
"#" not= "#" not=
(read-string op))) (-> op read-string eval)))
lexicon/op-commands))) lexicon/op-commands)))
(defn resolve-register [registers reg] (defn resolve-register [registers reg]
@ -50,7 +49,6 @@
inc-instr-ptr #(assoc % :instr-ptr (inc instr-ptr)) inc-instr-ptr #(assoc % :instr-ptr (inc instr-ptr))
skip-next-instr-ptr #(assoc % :instr-ptr (+ instr-ptr 2)) skip-next-instr-ptr #(assoc % :instr-ptr (+ instr-ptr 2))
resolve #(resolve-arg % registers labels)] resolve #(resolve-arg % registers labels)]
;(pprint [command (op-map command) acc arg (resolve arg)])
(case command (case command
"GOTO" (assoc state :instr-ptr (resolve arg)) "GOTO" (assoc state :instr-ptr (resolve arg))
"GOSUB" (assoc (assoc state :call-stack (conj call-stack (inc instr-ptr))) "GOSUB" (assoc (assoc state :call-stack (conj call-stack (inc instr-ptr)))
@ -60,12 +58,7 @@
:instr-ptr :instr-ptr
(peek call-stack)) (peek call-stack))
("IF" ",") (inc-instr-ptr (assoc state :acc (resolve arg))) ("IF" ",") (inc-instr-ptr (assoc state :acc (resolve arg)))
("+" "-" "*" "/") (do (pprint [(op-map command) ("+" "-" "*" "/") (inc-instr-ptr (assoc state :acc ((op-map command) acc (resolve arg))))
acc
(resolve arg)
state
(assoc state :acc ((op-map command) acc (resolve arg)))])
(inc-instr-ptr (assoc state :acc ((op-map command) acc (resolve arg)))))
("=" ">" "<" "#") (if ((op-map command) acc (resolve arg)) ("=" ">" "<" "#") (if ((op-map command) acc (resolve arg))
(inc-instr-ptr state) (inc-instr-ptr state)
(skip-next-instr-ptr state)) (skip-next-instr-ptr state))