From 6941ecff2a1d1bcdeed74f2c83d0f93dcf3ea7ec Mon Sep 17 00:00:00 2001 From: Eric Schulte Date: Mon, 24 Jan 2011 01:07:16 -0700 Subject: [PATCH] a simple spreadsheet application --- src/spreadsheet.clj | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 src/spreadsheet.clj diff --git a/src/spreadsheet.clj b/src/spreadsheet.clj new file mode 100644 index 0000000..0d374eb --- /dev/null +++ b/src/spreadsheet.clj @@ -0,0 +1,44 @@ +(ns propagator.spreadsheet + (use propagator)) + +(def xrange 10) (def yrange 10) + +(def spreadsheet + (map (fn [_] (map (fn [_] + (let [c (gensym)] (eval `(defcell ~c nil)) c)) + (range xrange))) + (range yrange))) + +(defn spreadsheet-print [] + (doseq [row spreadsheet] + (->> (map (comp deref eval) row) + (map #(if (nil? %) "[ ]" (format "[%5.2f]" (float %)))) + (interpose " ") + (apply str) + (println))) (println)) + +(defn parse [exp] + (let [refs (transient [])] + (letfn [(parse [exp] + (cond + (vector? exp) + (let [[x y] exp + c (-> spreadsheet (nth x) (nth y))] + (conj! refs c) c) + (seq? exp) + (let [lst (map parse exp)] (dorun lst) lst) + true exp))] + [(parse exp) (set (persistent! refs))]))) + +(defn spreadsheet-set [[x y] v] + (if (seq? v) + (let [[e rs] (parse v) + out-cell (-> spreadsheet (nth y) (nth x))] + (eval `(defpropagator fm ~(vec rs) [~out-cell] ~e))) + (set-cell (eval (-> spreadsheet (nth y) (nth x))) v))) + +(comment ; example usage + (spreadsheet-set [2 2] '(+ [1 1] [0 0])) ; a formula -- propagator + (spreadsheet-set [0 0] 2) ; an integer -- cell + (spreadsheet-set [1 1] 45) ; an integer -- cell + (spreadsheet-print)) -- 2.11.4.GIT