diff --git a/resources/public/docs/mw-engine/uberdoc.html b/resources/public/docs/mw-engine/uberdoc.html index 8a15e4b..f4ba5b6 100644 --- a/resources/public/docs/mw-engine/uberdoc.html +++ b/resources/public/docs/mw-engine/uberdoc.html @@ -3029,7 +3029,7 @@ net.brehaut.ClojureTools = (function (SH) { }; })(SyntaxHighlighter); mw-engine -- Marginalia

mw-engine

0.1.0-SNAPSHOT


Cellular automaton world builder.

-

dependencies

org.clojure/clojure
1.5.1
org.clojure/math.combinatorics
0.0.7
net.mikera/imagez
0.3.1
fivetonine/collage
0.2.0



(this space intentionally left almost blank)
 

Functions to transform a world and run rules.

+

dependencies

org.clojure/clojure
1.5.1
org.clojure/math.combinatorics
0.0.7
org.clojure/tools.trace
0.7.8
net.mikera/imagez
0.3.1
fivetonine/collage
0.2.0



(this space intentionally left almost blank)
 

Functions to transform a world and run rules.

(ns mw-engine.core
   (:require [mw-engine.world :as world]
@@ -3054,11 +3054,34 @@ See world.clj.

Each time the world is transformed (see transform-world, for each cell, rules are applied in turn until one matches. Once one rule has matched no further rules can be applied.

-

Derive a cell from this cell of this world by applying these rules.

+

Apply a single rule to a cell. What this is about is that I want to be able, + for debugging purposes, to tag a cell with the rule text of the rule which + fired (and especially so when an exception is thrown. So a rule may be either + an ifn, or a list (ifn source-text). This function deals with despatching + on those two possibilities.

+
(defn apply-rule 
+  ([cell world rule]
+   (cond
+     (ifn? rule) (apply-rule cell world rule nil)
+     (seq? rule) (let [[afn src] rule] (apply-rule cell world afn src))))
+                  ;; {:afn afn :src src})))
+     ;; (apply-rule cell world (first rule) (first (rest rule)))))
+  ([cell world rule source]
+    (try
+      (let [result (apply rule (list cell world))]
+        (cond 
+          (and result source) (merge result {:rule source})
+          true result))
+      (catch Exception e
+        (merge cell {:error (format "%s at generation %d when in state %s"
+                           (.getMessage e)
+                           (:generation cell)
+                           (:state cell))
+                     :error-rule source})))))

Derive a cell from this cell of this world by applying these rules.

(defn- apply-rules
   [cell world rules]
   (cond (empty? rules) cell
-    true (let [result (apply (eval (first rules)) (list cell world))]
+    true (let [result (apply-rule cell world (first rules))]
            (cond result result
              true (apply-rules cell world (rest rules))))))

Derive a cell from this cell of this world by applying these rules. If an exception is thrown, cache its message on the cell and set state to error

diff --git a/resources/public/docs/mw-parser/uberdoc.html b/resources/public/docs/mw-parser/uberdoc.html index 4b6e319..e7b0e9f 100644 --- a/resources/public/docs/mw-parser/uberdoc.html +++ b/resources/public/docs/mw-parser/uberdoc.html @@ -3053,7 +3053,7 @@ objective is to parse rules out of a block of text from a textarea

function, and return the sequence of such functions.

(defn compile-string
   [string]
-  (map compile-rule (remove comment? (split string #"\n"))))

Compile each non-comment line of the file indicated by this filename into + (map #(compile-rule % true) (remove comment? (split string #"\n"))))

Compile each non-comment line of the file indicated by this filename into an executable anonymous function, and return the sequence of such functions.

(defn compile-file 
   [filename]
@@ -3393,18 +3393,26 @@ front of the sequence of tokens it returns nil.

true (let [[left remainder] (parse-left-hand-side line) [right junk] (parse-right-hand-side remainder)] - ;; TODO: there shouldn't be any junk (should be null) (cond - (and left right (nil? junk)) + ;; there should be a valide left hand side and a valid right hand side + ;; there shouldn't be anything left over (junk should be empty) + (and left right (empty? junk)) (list 'fn ['cell 'world] (list 'if left right))))))

Parse this rule-text, a string conforming to the grammar of MicroWorld rules, into Clojure source, and then compile it into an anonymous function object, getting round the problem of binding mw-engine.utils in - the compiling environment.

+ the compiling environment. If return-tuple? is present and true, return + a list comprising the anonymous function compiled, and the function from + which it was compiled.

Throws an exception if parsing fails.

(defn compile-rule 
-  [rule-text]
-  (do
-    (use 'mw-engine.utils)
-    (eval (parse-rule rule-text))))  
 
\ No newline at end of file