963 lines
62 KiB
HTML
963 lines
62 KiB
HTML
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<link rel="stylesheet" href="../coverage.css"/> <title> mw_parser/generate.clj </title>
|
|
</head>
|
|
<body>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
001 (ns ^{:doc "Generate Clojure source from simplified parse trees."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
002 :author "Simon Brooke"}
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
003 mw-parser.generate
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
004 (:require [mw-parser.utils :refer [assert-type TODO]]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
005 [mw-parser.errors :as pe]))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
006
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
007 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
008 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
009 ;; This program is free software; you can redistribute it and/or
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
010 ;; modify it under the terms of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
011 ;; as published by the Free Software Foundation; either version 2
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
012 ;; of the License, or (at your option) any later version.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
013 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
014 ;; This program is distributed in the hope that it will be useful,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
015 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
016 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
017 ;; GNU General Public License for more details.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
018 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
019 ;; You should have received a copy of the GNU General Public License
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
020 ;; along with this program; if not, write to the Free Software
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
021 ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
022 ;; USA.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
023 ;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
024 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
025
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
026
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
027 (declare generate generate-action)
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
028
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
029
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
030 (defn generate-rule
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
031 "From this `tree`, assumed to be a syntactically correct rule specification,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
032 generate and return the appropriate rule as a function of two arguments."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
033 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
034 (assert-type tree :RULE)
|
|
</span><br/>
|
|
<span class="covered" title="19 out of 19 forms covered">
|
|
035 (list 'fn ['cell 'world] (list 'if (generate (nth tree 2)) (generate (nth tree 3)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
036
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
037
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
038 (defn generate-conditions
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
039 "From this `tree`, assumed to be a syntactically correct conditions clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
040 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
041 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
042 (assert-type tree :CONDITIONS)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
043 (generate (second tree)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
044
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
045
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
046 (defn generate-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
047 "From this `tree`, assumed to be a syntactically correct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
048 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
049 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
050 (assert-type tree :CONDITION)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
051 (generate (second tree)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
052
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
053
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
054 (defn generate-conjunct-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
055 "From this `tree`, assumed to be a syntactically conjunct correct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
056 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
057 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
058 (assert-type tree :CONJUNCT-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
059 (cons 'and (map generate (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
060
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
061
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
062 (defn generate-disjunct-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
063 "From this `tree`, assumed to be a syntactically correct disjunct condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
064 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
065 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
066 (assert-type tree :DISJUNCT-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
067 (cons 'or (map generate (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
068
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
069
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
070 (defn generate-ranged-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
071 "From this `tree`, assumed to be a syntactically property condition clause for
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
072 this `property` where the `expression` is a numeric range, generate and return
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
073 the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
074 [tree property expression]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
075 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
076 (assert-type (nth tree 3) :RANGE-EXPRESSION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
077 (let [l1 (generate (nth expression 2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
078 l2 (generate (nth expression 4))
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
079 pv (list property 'cell)]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
080 (list 'let ['lower (list 'min l1 l2)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
081 'upper (list 'max l1 l2)]
|
|
</span><br/>
|
|
<span class="covered" title="13 out of 13 forms covered">
|
|
082 (list 'and (list '>= pv 'lower) (list '<= pv 'upper)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
083
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
084
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
085 (defn generate-disjunct-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
086 "From this `tree`, assumed to be a syntactically property condition clause
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
087 where the expression is a a disjunction, generate and return
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
088 the appropriate clojure fragment.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
089 TODO: this is definitely still wrong!"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
090 ([tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
091 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
092 qualifier (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
093 expression (generate (nth tree 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
094 (generate-disjunct-property-condition tree property qualifier expression)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
095 ([_tree property qualifier expression]
|
|
</span><br/>
|
|
<span class="covered" title="14 out of 14 forms covered">
|
|
096 (let [e (list 'some (list 'fn ['i] '(= i value)) (list 'quote expression))]
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
097 (list 'let ['value (list property 'cell)]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
098 (if (= qualifier '=) e
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
099 (list 'not e))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
100
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
101
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
102 (defn generate-property-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
103 "From this `tree`, assumed to be a syntactically property condition clause,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
104 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
105 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
106 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
107 (if
|
|
</span><br/>
|
|
<span class="covered" title="15 out of 15 forms covered">
|
|
108 (and (= (count tree) 2) (= (first (second tree)) :SYMBOL))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
109 ;; it's a shorthand for 'state equal to symbol'. This should probably have
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
110 ;; been handled in simplify...
|
|
</span><br/>
|
|
<span class="covered" title="2 out of 2 forms covered">
|
|
111 (generate-property-condition
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
112 (list
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
113 :PROPERTY-CONDITION
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
114 '(:SYMBOL "state")
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
115 '(:QUALIFIER (:EQUIVALENCE (:EQUAL "equal to")))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
116 (second tree)))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
117 ;; otherwise...
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
118 (generate-property-condition tree (first (nth tree 3)))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
119 ([tree expression-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
120 (assert-type tree :PROPERTY-CONDITION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
121 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
122 qualifier (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
123 e (generate (nth tree 3))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
124 expression (cond
|
|
</span><br/>
|
|
<span class="covered" title="20 out of 20 forms covered">
|
|
125 (and (not (= qualifier '=)) (keyword? e)) (list 'or (list e 'cell) e)
|
|
</span><br/>
|
|
<span class="covered" title="20 out of 20 forms covered">
|
|
126 (and (not (= qualifier 'not=)) (keyword? e)) (list 'or (list e 'cell) e)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
127 :else e)]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
128 (case expression-type
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
129 :DISJUNCT-EXPRESSION (generate-disjunct-property-condition tree property qualifier expression)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
130 :RANGE-EXPRESSION (generate-ranged-property-condition tree property expression)
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
131 (list qualifier (list property 'cell) expression)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
132
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
133 (defn generate-qualifier
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
134 "From this `tree`, assumed to be a syntactically correct qualifier,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
135 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
136 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
137 (if
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
138 (= (count tree) 2)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
139 (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
140 ;; else
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
141 (generate (nth tree 2))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
142
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
143 (defn generate-simple-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
144 "From this `tree`, assumed to be a syntactically correct simple action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
145 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
146 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
147 (assert-type tree :SIMPLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
148 (generate-simple-action tree []))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
149 ([tree others]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
150 (assert-type tree :SIMPLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
151 (let [property (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
152 expression (generate (nth tree 3))]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
153 (if (or (= property :x) (= property :y))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
154 (throw (Exception. pe/reserved-properties-error))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
155 (list 'merge
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
156 (if (empty? others) 'cell
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
157 ;; else
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
158 (generate others))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
159 {property expression})))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
160
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
161 (defn generate-probable-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
162 "From this `tree`, assumed to be a syntactically correct probable action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
163 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
164 ([tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
165 (assert-type tree :PROBABLE-ACTION)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
166 (generate-probable-action tree []))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
167 ([tree others]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
168 (assert-type tree :PROBABLE-ACTION)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
169 (let
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
170 [chances (generate (nth tree 1))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
171 total (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
172 action (generate-action (nth tree 3) others)]
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
173 ;; TODO: could almost certainly be done better with macro syntax
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
174 (list 'if
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
175 (list '< (list 'rand total) chances)
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
176 action))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
177
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
178 (defn generate-action
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
179 "From this `tree`, assumed to be a syntactically correct action,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
180 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
181 [tree others]
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
182 (case (first tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
183 :ACTIONS (generate-action (first tree) others)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
184 :SIMPLE-ACTION (generate-simple-action tree others)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
185 :PROBABLE-ACTION (generate-probable-action tree others)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
186 (throw (Exception. (str "Not a known action type: " (first tree))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
187
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
188 (defn generate-multiple-actions
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
189 "From this `tree`, assumed to be one or more syntactically correct actions,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
190 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
191 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
192 (assert-type tree :ACTIONS)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
193 (generate-action (first (rest tree)) (second (rest tree))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
194
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
195 (defn generate-disjunct-value
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
196 "Generate a disjunct value. Essentially what we need here is to generate a
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
197 flat list of values, since the `member` has already been taken care of."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
198 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
199 (assert-type tree :DISJUNCT-VALUE)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
200 (if (= (count tree) 4)
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
201 (cons (generate (second tree)) (generate (nth tree 3)))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
202 (list (generate (second tree)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
203
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
204 (defn generate-numeric-expression
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
205 "From this `tree`, assumed to be a syntactically correct numeric expression,
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
206 generate and return the appropriate clojure fragment."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
207 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
208 (assert-type tree :NUMERIC-EXPRESSION)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
209 (case (count tree)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
210 4 (let [[p operator expression] (rest tree)
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 9 forms covered">
|
|
211 property (if (number? p) p (list p 'cell))]
|
|
</span><br/>
|
|
<span class="covered" title="11 out of 11 forms covered">
|
|
212 (list (generate operator) (generate property) (generate expression)))
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
213 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
214 :SYMBOL (list (keyword (second (second tree))) 'cell)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
215 (generate (second tree)))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
216
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
217 (defn generate-neighbours-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
218 "Generate code for a condition which refers to neighbours."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
219 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
220 (assert-type tree :NEIGHBOURS-CONDITION)
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 13 forms covered">
|
|
221 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 7 forms covered">
|
|
222 :NUMBER (read-string (second (second tree)))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
223 :QUANTIFIER (generate-neighbours-condition tree (first (second (second tree))))
|
|
</span><br/>
|
|
<span class="covered" title="14 out of 14 forms covered">
|
|
224 :QUALIFIER (cons (generate (second tree)) (rest (generate (nth tree 2))))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
225 ([tree quantifier-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
226 (let [quantifier (second tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
227 pc (generate (nth tree 4))]
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 9 forms covered">
|
|
228 (case quantifier-type
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
229 :NUMBER (generate-neighbours-condition '= (read-string (second (second quantifier))) pc 1)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
230 :SOME (generate-neighbours-condition '> 0 pc 1)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
231 :MORE (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
232 (generate-neighbours-condition '> value pc 1))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
233 :LESS (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
234 (generate-neighbours-condition '< value pc 1)))))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
235 ([comp1 quantity property-condition distance]
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
236 (list comp1
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
237 (list 'count
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
238 (list 'remove 'false?
|
|
</span><br/>
|
|
<span class="covered" title="9 out of 9 forms covered">
|
|
239 (list 'map (list 'fn ['cell] property-condition)
|
|
</span><br/>
|
|
<span class="covered" title="7 out of 7 forms covered">
|
|
240 (list 'mw-engine.utils/get-neighbours 'world 'cell distance)))) quantity))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
241 ([comp1 quantity property-condition]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
242 (generate-neighbours-condition comp1 quantity property-condition 1)))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
243
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
244
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
245 (defn generate-within-condition
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
246 "Generate code for a condition which refers to neighbours within a specified distance.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
247 NOTE THAT there's clearly masses of commonality between this and
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
248 `generate-neighbours-condition`, and that some refactoring is almost certainly
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
249 desirable. It may be that it's better to simplify a `NEIGHBOURS-CONDITION`
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
250 into a `WITHIN-CONDITION` in the simplification stage."
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
251 ([tree]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
252 (assert-type tree :WITHIN-CONDITION)
|
|
</span><br/>
|
|
<span class="partial" title="7 out of 13 forms covered">
|
|
253 (case (first (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="10 out of 10 forms covered">
|
|
254 :QUANTIFIER (generate-within-condition tree (first (second (second tree))))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
255 :QUALIFIER (TODO "qualified within... help!")))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
256 ([tree quantifier-type]
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
257 (let [quantifier (second tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
258 distance (generate (nth tree 4))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
259 pc (generate (nth tree 6))]
|
|
</span><br/>
|
|
<span class="partial" title="3 out of 9 forms covered">
|
|
260 (case quantifier-type
|
|
</span><br/>
|
|
<span class="covered" title="12 out of 12 forms covered">
|
|
261 :NUMBER (generate-neighbours-condition '= (read-string (second (second quantifier))) pc distance)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
262 :SOME (generate-neighbours-condition '> 0 pc distance)
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
263 :MORE (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="covered" title="6 out of 6 forms covered">
|
|
264 (generate-neighbours-condition '> value pc distance))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
265 :LESS (let [value (generate (nth quantifier 3))]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 6 forms covered">
|
|
266 (generate-neighbours-condition '< value pc distance))))))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
267
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
268 (defn generate-flow
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
269 [tree]
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 4 forms covered">
|
|
270 (assert-type tree :WITHIN-CONDITION))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
271
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
272 (defn generate
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
273 "Generate code for this (fragment of a) parse tree"
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
274 [tree]
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
275 (if
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
276 (coll? tree)
|
|
</span><br/>
|
|
<span class="covered" title="8 out of 8 forms covered">
|
|
277 (case (first tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
278 :ACTIONS (generate-multiple-actions tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
279 :COMPARATIVE (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
280 :COMPARATIVE-QUALIFIER (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
281 :CONDITION (generate-condition tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
282 :CONDITIONS (generate-conditions tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
283 :CONJUNCT-CONDITION (generate-conjunct-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
284 :DISJUNCT-CONDITION (generate-disjunct-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
285 :DISJUNCT-EXPRESSION (generate (nth tree 2))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
286 :DISJUNCT-VALUE (generate-disjunct-value tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
287 :EQUIVALENCE '=
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
288 :EXPRESSION (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
289 :FLOW-RULE (generate-flow tree)
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
290 :LESS '<
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
291 :MORE '>
|
|
</span><br/>
|
|
<span class="partial" title="8 out of 16 forms covered">
|
|
292 :NEGATED-QUALIFIER (case (generate (second tree))
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
293 = 'not=
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
294 > '<
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
295 < '>)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
296 :NEIGHBOURS-CONDITION (generate-neighbours-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
297 :NUMERIC-EXPRESSION (generate-numeric-expression tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
298 :NUMBER (read-string (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
299 :OPERATOR (symbol (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 3 forms covered">
|
|
300 :PROBABLE-ACTION (generate-probable-action tree)
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 8 forms covered">
|
|
301 :PROPERTY (list (generate (second tree)) 'cell) ;; dubious - may not be right
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
302 :PROPERTY-CONDITION (generate-property-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
303 :QUALIFIER (generate-qualifier tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
304 :RULE (generate-rule tree)
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
305 :SIMPLE-ACTION (generate-simple-action tree)
|
|
</span><br/>
|
|
<span class="covered" title="5 out of 5 forms covered">
|
|
306 :SYMBOL (keyword (second tree))
|
|
</span><br/>
|
|
<span class="not-covered" title="0 out of 5 forms covered">
|
|
307 :VALUE (generate (second tree))
|
|
</span><br/>
|
|
<span class="covered" title="3 out of 3 forms covered">
|
|
308 :WITHIN-CONDITION (generate-within-condition tree)
|
|
</span><br/>
|
|
<span class="covered" title="4 out of 4 forms covered">
|
|
309 (map generate tree))
|
|
</span><br/>
|
|
<span class="covered" title="1 out of 1 forms covered">
|
|
310 tree))
|
|
</span><br/>
|
|
<span class="blank" title="0 out of 0 forms covered">
|
|
311
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
312 ;;; Flow rules. A flow rule DOES NOT return a modified world; instead, it
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
313 ;;; returns a PLAN to modify the world, in the form of a sequence of `flows`.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
314 ;;; It is only when the plan is executed that the world is modified.
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
315 ;;;
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
316 ;;; so we're looking at something like
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
317 ;;; (fn [cell world])
|
|
</span><br/>
|
|
<span class="not-tracked" title="0 out of 0 forms covered">
|
|
318 ;;; (if (= (:state cell) (or (:house cell) :house))
|
|
</span><br/>
|
|
</body>
|
|
</html>
|