Yay! Fixed the rule compiling bug! Rules now compile correctly.

This commit is contained in:
Simon Brooke 2014-07-07 22:21:12 +01:00
parent 2dc5e394cc
commit 727e5ccb11
2 changed files with 26 additions and 8 deletions

View file

@ -285,3 +285,12 @@
(list 'fn ['cell 'world] (list 'if left right)) (list 'fn ['cell 'world] (list 'if left right))
))) )))
(defn compile-rule
"Parse this `rule`, 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."
[rule-text]
(do
(use 'mw-engine.utils)
(eval (parse-rule rule-text))))

View file

@ -1,5 +1,5 @@
(ns mw-parser.core-test (ns mw-parser.core-test
(:use mw-engine.utils) (:use [mw-engine.utils :refer :all])
(:require [clojure.test :refer :all] (:require [clojure.test :refer :all]
[mw-parser.core :refer :all])) [mw-parser.core :refer :all]))
@ -16,11 +16,20 @@
(is (parse-rule "if state is forest and fertility is between 55 and 75 then state should be climax")) (is (parse-rule "if state is forest and fertility is between 55 and 75 then state should be climax"))
(is (parse-rule "if 6 neighbours have state equal to water then state should be village")) (is (parse-rule "if 6 neighbours have state equal to water then state should be village"))
(is (parse-rule "if state is in grassland or pasture or heath and 4 neighbours are water then state should be village")) (is (parse-rule "if state is in grassland or pasture or heath and 4 neighbours are water then state should be village"))
;; ideally should also test that the rule works, but I haven't worked out how to make mw-engine.utils available
;; during eval
;; (is (let [cell (apply (eval (parse-rule "if altitude is less than 100 and state is forest then state should be climax and deer should be 3"))
;; (list {:state :forest :altitude 99} nil))]
;; (and (= (:state cell) :climax) (= (:deer cell) 3))))
)) ))
;; ideally should also test that the rule works, but I haven't worked out how
;; to make mw-engine.utils available during eval
(deftest generation-tests
(testing "Code generation"
(is
(do
(use 'mw-engine.utils)
(eval
(parse-rule "if altitude is less than 100 and state is forest then state should be climax and deer should be 3"))))))
(deftest correctness-tests
(testing "Testing that generated code performs as expected."
(is (let [afn (compile-rule "if altitude is less than 100 and state is forest then state should be climax and deer should be 3")
cell (apply afn (list {:state :forest :altitude 99} nil))]
(and (= (:state cell) :climax) (= (:deer cell) 3))))))