mw-parser/docs/cloverage/mw_parser/core.clj.html

1362 lines
92 KiB
HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="../coverage.css"/> <title> mw_parser/core.clj </title>
</head>
<body>
<span class="covered" title="1 out of 1 forms covered">
001&nbsp;&nbsp;(ns&nbsp;^{:doc&nbsp;&quot;A&nbsp;very&nbsp;simple&nbsp;parser&nbsp;which&nbsp;parses&nbsp;production&nbsp;rules.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
002&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:author&nbsp;&quot;Simon&nbsp;Brooke&quot;}
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
003&nbsp;&nbsp;&nbsp;&nbsp;mw-parser.core
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
004&nbsp;&nbsp;&nbsp;&nbsp;(:use&nbsp;mw-engine.utils
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
005&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[clojure.string&nbsp;:only&nbsp;[split&nbsp;trim&nbsp;triml]])
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
006&nbsp;&nbsp;&nbsp;&nbsp;(:gen-class)
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
007&nbsp;&nbsp;)
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
008&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
009&nbsp;&nbsp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
010&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
011&nbsp;&nbsp;;;;;&nbsp;mw-parser:&nbsp;a&nbsp;rule&nbsp;parser&nbsp;for&nbsp;MicroWorld.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
012&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
013&nbsp;&nbsp;;;;;&nbsp;This&nbsp;program&nbsp;is&nbsp;free&nbsp;software;&nbsp;you&nbsp;can&nbsp;redistribute&nbsp;it&nbsp;and&#x2F;or
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
014&nbsp;&nbsp;;;;;&nbsp;modify&nbsp;it&nbsp;under&nbsp;the&nbsp;terms&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
015&nbsp;&nbsp;;;;;&nbsp;as&nbsp;published&nbsp;by&nbsp;the&nbsp;Free&nbsp;Software&nbsp;Foundation;&nbsp;either&nbsp;version&nbsp;2
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
016&nbsp;&nbsp;;;;;&nbsp;of&nbsp;the&nbsp;License,&nbsp;or&nbsp;(at&nbsp;your&nbsp;option)&nbsp;any&nbsp;later&nbsp;version.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
017&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
018&nbsp;&nbsp;;;;;&nbsp;This&nbsp;program&nbsp;is&nbsp;distributed&nbsp;in&nbsp;the&nbsp;hope&nbsp;that&nbsp;it&nbsp;will&nbsp;be&nbsp;useful,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
019&nbsp;&nbsp;;;;;&nbsp;but&nbsp;WITHOUT&nbsp;ANY&nbsp;WARRANTY;&nbsp;without&nbsp;even&nbsp;the&nbsp;implied&nbsp;warranty&nbsp;of
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
020&nbsp;&nbsp;;;;;&nbsp;MERCHANTABILITY&nbsp;or&nbsp;FITNESS&nbsp;FOR&nbsp;A&nbsp;PARTICULAR&nbsp;PURPOSE.&nbsp;&nbsp;See&nbsp;the
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
021&nbsp;&nbsp;;;;;&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License&nbsp;for&nbsp;more&nbsp;details.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
022&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
023&nbsp;&nbsp;;;;;&nbsp;You&nbsp;should&nbsp;have&nbsp;received&nbsp;a&nbsp;copy&nbsp;of&nbsp;the&nbsp;GNU&nbsp;General&nbsp;Public&nbsp;License
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
024&nbsp;&nbsp;;;;;&nbsp;along&nbsp;with&nbsp;this&nbsp;program;&nbsp;if&nbsp;not,&nbsp;write&nbsp;to&nbsp;the&nbsp;Free&nbsp;Software
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
025&nbsp;&nbsp;;;;;&nbsp;Foundation,&nbsp;Inc.,&nbsp;51&nbsp;Franklin&nbsp;Street,&nbsp;Fifth&nbsp;Floor,&nbsp;Boston,&nbsp;MA&nbsp;&nbsp;02110-1301,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
026&nbsp;&nbsp;;;;;&nbsp;USA.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
027&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
028&nbsp;&nbsp;;;;;&nbsp;Copyright&nbsp;(C)&nbsp;2014&nbsp;Simon&nbsp;Brooke
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
029&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
030&nbsp;&nbsp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
031&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
032&nbsp;&nbsp;;;;;&nbsp;A&nbsp;very&nbsp;simple&nbsp;parser&nbsp;which&nbsp;parses&nbsp;production&nbsp;rules&nbsp;of&nbsp;the&nbsp;following&nbsp;forms:
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
033&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
034&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;altitude&nbsp;is&nbsp;less&nbsp;than&nbsp;100&nbsp;and&nbsp;state&nbsp;is&nbsp;forest&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;climax&nbsp;and&nbsp;deer&nbsp;should&nbsp;be&nbsp;3&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
035&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;altitude&nbsp;is&nbsp;100&nbsp;or&nbsp;fertility&nbsp;is&nbsp;25&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;heath&nbsp;and&nbsp;fertility&nbsp;should&nbsp;be&nbsp;24.3&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
036&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;altitude&nbsp;is&nbsp;100&nbsp;or&nbsp;fertility&nbsp;is&nbsp;25&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;heath&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
037&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;deer&nbsp;is&nbsp;more&nbsp;than&nbsp;2&nbsp;and&nbsp;wolves&nbsp;is&nbsp;0&nbsp;and&nbsp;fertility&nbsp;is&nbsp;more&nbsp;than&nbsp;20&nbsp;then&nbsp;deer&nbsp;should&nbsp;be&nbsp;deer&nbsp;+&nbsp;2&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
038&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;deer&nbsp;is&nbsp;more&nbsp;than&nbsp;1&nbsp;and&nbsp;wolves&nbsp;is&nbsp;more&nbsp;than&nbsp;1&nbsp;then&nbsp;deer&nbsp;should&nbsp;be&nbsp;deer&nbsp;-&nbsp;wolves&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
039&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;state&nbsp;is&nbsp;grassland&nbsp;and&nbsp;4&nbsp;neighbours&nbsp;have&nbsp;state&nbsp;equal&nbsp;to&nbsp;water&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;village&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
040&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;state&nbsp;is&nbsp;forest&nbsp;and&nbsp;fertility&nbsp;is&nbsp;between&nbsp;55&nbsp;and&nbsp;75&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;climax&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
041&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;6&nbsp;neighbours&nbsp;have&nbsp;state&nbsp;equal&nbsp;to&nbsp;water&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;village&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
042&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;state&nbsp;is&nbsp;in&nbsp;grassland&nbsp;or&nbsp;pasture&nbsp;or&nbsp;heath&nbsp;and&nbsp;4&nbsp;neighbours&nbsp;are&nbsp;water&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;village&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
043&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;state&nbsp;is&nbsp;forest&nbsp;or&nbsp;state&nbsp;is&nbsp;climax&nbsp;and&nbsp;some&nbsp;neighbours&nbsp;have&nbsp;state&nbsp;equal&nbsp;to&nbsp;fire&nbsp;then&nbsp;3&nbsp;in&nbsp;5&nbsp;chance&nbsp;that&nbsp;state&nbsp;should&nbsp;be&nbsp;fire&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
044&nbsp;&nbsp;;;;;&nbsp;*&nbsp;&quot;if&nbsp;state&nbsp;is&nbsp;pasture&nbsp;and&nbsp;more&nbsp;than&nbsp;3&nbsp;neighbours&nbsp;have&nbsp;state&nbsp;equal&nbsp;to&nbsp;scrub&nbsp;then&nbsp;state&nbsp;should&nbsp;be&nbsp;scrub&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
045&nbsp;&nbsp;;;;;&nbsp;*
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
046&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
047&nbsp;&nbsp;;;;;&nbsp;it&nbsp;generates&nbsp;rules&nbsp;in&nbsp;the&nbsp;form&nbsp;expected&nbsp;by&nbsp;`mw-engine.core`,&nbsp;q.v.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
048&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
049&nbsp;&nbsp;;;;;&nbsp;It&nbsp;is,&nbsp;as&nbsp;I&nbsp;say,&nbsp;very&nbsp;simple;&nbsp;it&nbsp;generates&nbsp;a&nbsp;complete&nbsp;rule,&nbsp;or&nbsp;it&nbsp;fails&nbsp;completely,&nbsp;returning&nbsp;nil.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
050&nbsp;&nbsp;;;;;&nbsp;Very&nbsp;occasionally&nbsp;it&nbsp;generates&nbsp;a&nbsp;wrong&nbsp;rule&nbsp;-&nbsp;one&nbsp;which&nbsp;is&nbsp;not&nbsp;a&nbsp;correct&nbsp;translation&nbsp;of&nbsp;the&nbsp;rule
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
051&nbsp;&nbsp;;;;;&nbsp;semantics&nbsp;-&nbsp;but&nbsp;that&nbsp;is&nbsp;buggy&nbsp;behaviour,&nbsp;which&nbsp;I&#x27;ll&nbsp;try&nbsp;to&nbsp;fix&nbsp;over&nbsp;the&nbsp;next&nbsp;few&nbsp;weeks,&nbsp;not&nbsp;a
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
052&nbsp;&nbsp;;;;;&nbsp;design&nbsp;fault.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
053&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
054&nbsp;&nbsp;;;;;&nbsp;More&nbsp;significantly&nbsp;it&nbsp;does&nbsp;not&nbsp;generate&nbsp;useful&nbsp;error&nbsp;messages&nbsp;on&nbsp;failure.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
055&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
056&nbsp;&nbsp;;;;;&nbsp;This&nbsp;parser&nbsp;is&nbsp;now&nbsp;obsolete,&nbsp;but&nbsp;is&nbsp;retained&nbsp;in&nbsp;the&nbsp;codebase&nbsp;for&nbsp;now&nbsp;in
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
057&nbsp;&nbsp;;;;;&nbsp;case&nbsp;it&nbsp;is&nbsp;of&nbsp;use&nbsp;to&nbsp;anyone.&nbsp;Prefer&nbsp;the&nbsp;declarative.clj&nbsp;parser.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
058&nbsp;&nbsp;;;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
059&nbsp;&nbsp;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
060&nbsp;&nbsp;
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
061&nbsp;&nbsp;(declare&nbsp;parse-conditions)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
062&nbsp;&nbsp;(declare&nbsp;parse-not-condition)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
063&nbsp;&nbsp;(declare&nbsp;parse-simple-condition)
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
064&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
065&nbsp;&nbsp;;;&nbsp;a&nbsp;regular&nbsp;expression&nbsp;which&nbsp;matches&nbsp;string&nbsp;representation&nbsp;of&nbsp;positive&nbsp;numbers
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
066&nbsp;&nbsp;(def&nbsp;re-number&nbsp;#&quot;^[0-9.]*$&quot;)
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
067&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
068&nbsp;&nbsp;;;&nbsp;error&nbsp;thrown&nbsp;when&nbsp;an&nbsp;attempt&nbsp;is&nbsp;made&nbsp;to&nbsp;set&nbsp;a&nbsp;reserved&nbsp;property
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
069&nbsp;&nbsp;(def&nbsp;reserved-properties-error
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
070&nbsp;&nbsp;&nbsp;&nbsp;&quot;The&nbsp;properties&nbsp;&#x27;x&#x27;&nbsp;and&nbsp;&#x27;y&#x27;&nbsp;of&nbsp;a&nbsp;cell&nbsp;are&nbsp;reserved&nbsp;and&nbsp;should&nbsp;not&nbsp;be&nbsp;set&nbsp;in&nbsp;rule&nbsp;actions&quot;)
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
071&nbsp;&nbsp;;;&nbsp;error&nbsp;thrown&nbsp;when&nbsp;a&nbsp;rule&nbsp;cannot&nbsp;be&nbsp;parsed
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
072&nbsp;&nbsp;(def&nbsp;bad-parse-error&nbsp;&quot;I&nbsp;did&nbsp;not&nbsp;understand&nbsp;&#x27;%s&#x27;&quot;)
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
073&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
074&nbsp;&nbsp;(defn-&nbsp;keyword-or-numeric
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
075&nbsp;&nbsp;&nbsp;&nbsp;&quot;If&nbsp;this&nbsp;token&nbsp;appears&nbsp;to&nbsp;represent&nbsp;an&nbsp;explicit&nbsp;number,&nbsp;return&nbsp;that&nbsp;number;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
076&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;otherwise,&nbsp;make&nbsp;a&nbsp;keyword&nbsp;of&nbsp;it&nbsp;and&nbsp;return&nbsp;that.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
077&nbsp;&nbsp;&nbsp;&nbsp;[token]
</span><br/>
<span class="partial" title="4 out of 5 forms covered">
078&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
079&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(re-matches&nbsp;re-number&nbsp;token)&nbsp;(read-string&nbsp;token)
</span><br/>
<span class="partial" title="3 out of 4 forms covered">
080&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword?&nbsp;token)&nbsp;token
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
081&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;(keyword&nbsp;token)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
082&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
083&nbsp;&nbsp;;;&nbsp;Generally&nbsp;all&nbsp;functions&nbsp;in&nbsp;this&nbsp;file&nbsp;with&nbsp;names&nbsp;beginning&nbsp;&#x27;parse-&#x27;&nbsp;take&nbsp;a
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
084&nbsp;&nbsp;;;&nbsp;sequence&nbsp;of&nbsp;tokens&nbsp;(and&nbsp;in&nbsp;some&nbsp;cases&nbsp;other&nbsp;optional&nbsp;arguments)&nbsp;and&nbsp;return&nbsp;a
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
085&nbsp;&nbsp;;;&nbsp;vector&nbsp;comprising
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
086&nbsp;&nbsp;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
087&nbsp;&nbsp;;;&nbsp;1.&nbsp;A&nbsp;code&nbsp;fragment&nbsp;parsed&nbsp;from&nbsp;the&nbsp;front&nbsp;of&nbsp;the&nbsp;sequence&nbsp;of&nbsp;tokens,&nbsp;and
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
088&nbsp;&nbsp;;;&nbsp;2.&nbsp;the&nbsp;remaining&nbsp;tokens&nbsp;which&nbsp;were&nbsp;not&nbsp;consumed&nbsp;in&nbsp;constructing&nbsp;that&nbsp;fragment.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
089&nbsp;&nbsp;;;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
090&nbsp;&nbsp;;;&nbsp;In&nbsp;every&nbsp;case&nbsp;if&nbsp;the&nbsp;function&nbsp;cannot&nbsp;parse&nbsp;the&nbsp;desired&nbsp;construct&nbsp;from&nbsp;the
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
091&nbsp;&nbsp;;;&nbsp;front&nbsp;of&nbsp;the&nbsp;sequence&nbsp;of&nbsp;tokens&nbsp;it&nbsp;returns&nbsp;nil.
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
092&nbsp;&nbsp;
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
093&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
094&nbsp;&nbsp;(defn&nbsp;parse-numeric-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
095&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;number.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
096&nbsp;&nbsp;&nbsp;&nbsp;[[value&nbsp;&amp;&nbsp;remainder]]
</span><br/>
<span class="covered" title="15 out of 15 forms covered">
097&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(and&nbsp;value&nbsp;(re-matches&nbsp;re-number&nbsp;value))&nbsp;[(read-string&nbsp;value)&nbsp;remainder]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
098&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
099&nbsp;&nbsp;(defn&nbsp;parse-property-int
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
100&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;token&nbsp;assumed&nbsp;to&nbsp;be&nbsp;the&nbsp;name&nbsp;of&nbsp;a&nbsp;property&nbsp;of&nbsp;the&nbsp;current&nbsp;cell,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
101&nbsp;&nbsp;&nbsp;&nbsp;whose&nbsp;value&nbsp;is&nbsp;assumed&nbsp;to&nbsp;be&nbsp;an&nbsp;integer.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
102&nbsp;&nbsp;&nbsp;&nbsp;[[value&nbsp;&amp;&nbsp;remainder]]
</span><br/>
<span class="covered" title="11 out of 11 forms covered">
103&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;value&nbsp;[(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;value))&nbsp;remainder]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
104&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
105&nbsp;&nbsp;(defn&nbsp;parse-property-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
106&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;token&nbsp;assumed&nbsp;to&nbsp;be&nbsp;the&nbsp;name&nbsp;of&nbsp;a&nbsp;property&nbsp;of&nbsp;the&nbsp;current&nbsp;cell.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
107&nbsp;&nbsp;&nbsp;&nbsp;[[value&nbsp;&amp;&nbsp;remainder]]
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
108&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;value&nbsp;[(list&nbsp;(keyword&nbsp;value)&nbsp;&#x27;cell)&nbsp;remainder]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
109&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
110&nbsp;&nbsp;(defn&nbsp;parse-token-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
111&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;token&nbsp;assumed&nbsp;to&nbsp;be&nbsp;a&nbsp;simple&nbsp;token&nbsp;value.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
112&nbsp;&nbsp;&nbsp;&nbsp;[[value&nbsp;&amp;&nbsp;remainder]]
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
113&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;value&nbsp;[(keyword&nbsp;value)&nbsp;remainder]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
114&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
115&nbsp;&nbsp;(defn&nbsp;parse-simple-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
116&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;value&nbsp;from&nbsp;the&nbsp;first&nbsp;of&nbsp;these&nbsp;`tokens`.&nbsp;If&nbsp;`expect-int`&nbsp;is&nbsp;true,&nbsp;return
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
117&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;integer&nbsp;or&nbsp;something&nbsp;which&nbsp;will&nbsp;evaluate&nbsp;to&nbsp;an&nbsp;integer.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
118&nbsp;&nbsp;&nbsp;&nbsp;([tokens&nbsp;expect-int]
</span><br/>
<span class="partial" title="7 out of 8 forms covered">
119&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
120&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-numeric-value&nbsp;tokens)
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;expect-int
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
122&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-property-int&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
123&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;(parse-token-value&nbsp;tokens))))
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
124&nbsp;&nbsp;&nbsp;&nbsp;([tokens]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
125&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-simple-value&nbsp;tokens&nbsp;false)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
126&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
127&nbsp;&nbsp;(defn&nbsp;gen-token-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
128&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;single&nbsp;value&nbsp;from&nbsp;this&nbsp;single&nbsp;token&nbsp;and&nbsp;return&nbsp;just&nbsp;the&nbsp;generated
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
129&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;code,&nbsp;not&nbsp;a&nbsp;pair.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
130&nbsp;&nbsp;&nbsp;&nbsp;[token&nbsp;expect-int]
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
131&nbsp;&nbsp;&nbsp;&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;token)&nbsp;expect-int)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
132&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
133&nbsp;&nbsp;(defn&nbsp;parse-disjunct-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
134&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;list&nbsp;of&nbsp;values&nbsp;from&nbsp;among&nbsp;these&nbsp;`tokens`.&nbsp;If&nbsp;`expect-int`&nbsp;is&nbsp;true,&nbsp;return
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
135&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;integers&nbsp;or&nbsp;things&nbsp;which&nbsp;will&nbsp;evaluate&nbsp;to&nbsp;integers.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
136&nbsp;&nbsp;&nbsp;&nbsp;[[OR&nbsp;token&nbsp;&amp;&nbsp;tokens]&nbsp;expect-int]
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
137&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(member?&nbsp;OR&nbsp;&#x27;(&quot;or&quot;&nbsp;&quot;in&quot;))
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
138&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[value&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;token)&nbsp;expect-int))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
139&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;seek-others&nbsp;(=&nbsp;(first&nbsp;tokens)&nbsp;&quot;or&quot;)]
</span><br/>
<span class="partial" title="4 out of 5 forms covered">
140&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;seek-others
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[others&nbsp;remainder]&nbsp;(parse-disjunct-value&nbsp;tokens&nbsp;expect-int)]
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
142&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(cons&nbsp;value&nbsp;others)&nbsp;remainder])
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
143&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
144&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;value)&nbsp;tokens]))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
145&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
146&nbsp;&nbsp;(defn&nbsp;parse-value
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
147&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;value&nbsp;from&nbsp;among&nbsp;these&nbsp;`tokens`.&nbsp;If&nbsp;`expect-int`&nbsp;is&nbsp;true,&nbsp;return
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;an&nbsp;integer&nbsp;or&nbsp;something&nbsp;which&nbsp;will&nbsp;evaluate&nbsp;to&nbsp;an&nbsp;integer.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
149&nbsp;&nbsp;&nbsp;&nbsp;([tokens&nbsp;expect-int]
</span><br/>
<span class="partial" title="4 out of 5 forms covered">
150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-disjunct-value&nbsp;tokens&nbsp;expect-int)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-simple-value&nbsp;tokens&nbsp;expect-int)))
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
153&nbsp;&nbsp;&nbsp;&nbsp;([tokens]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
154&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-value&nbsp;tokens&nbsp;false)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
155&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
156&nbsp;&nbsp;(defn&nbsp;parse-member-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
157&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parses&nbsp;a&nbsp;condition&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;[property]&nbsp;in&nbsp;[value]&nbsp;or&nbsp;[value]...&#x27;&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
158&nbsp;&nbsp;&nbsp;&nbsp;[[property&nbsp;IS&nbsp;IN&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="11 out of 12 forms covered">
159&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(and&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))&nbsp;(=&nbsp;IN&nbsp;&quot;in&quot;))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[l&nbsp;remainder]&nbsp;(parse-disjunct-value&nbsp;(cons&nbsp;&quot;in&quot;&nbsp;rest)&nbsp;false)]
</span><br/>
<span class="covered" title="15 out of 15 forms covered">
161&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;member?&nbsp;(list&nbsp;(keyword&nbsp;property)&nbsp;&#x27;cell)&nbsp;(list&nbsp;&#x27;quote&nbsp;l))&nbsp;remainder])))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
162&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
163&nbsp;&nbsp;(defn-&nbsp;parse-less-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
164&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;&#x27;[property]&nbsp;less&nbsp;than&nbsp;[value]&#x27;.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
165&nbsp;&nbsp;&nbsp;&nbsp;[[property&nbsp;IS&nbsp;LESS&nbsp;THAN&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="20 out of 21 forms covered">
166&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))&nbsp;(member?&nbsp;LESS&nbsp;&#x27;(&quot;less&quot;&nbsp;&quot;fewer&quot;))&nbsp;(=&nbsp;THAN&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
167&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[value&nbsp;remainder]&nbsp;(parse-value&nbsp;rest&nbsp;true)]
</span><br/>
<span class="covered" title="13 out of 13 forms covered">
168&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;&lt;&nbsp;(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;property))&nbsp;value)&nbsp;remainder])))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
169&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
170&nbsp;&nbsp;(defn-&nbsp;parse-more-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
171&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;&#x27;[property]&nbsp;more&nbsp;than&nbsp;[value]&#x27;.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
172&nbsp;&nbsp;&nbsp;&nbsp;[[property&nbsp;IS&nbsp;MORE&nbsp;THAN&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="20 out of 21 forms covered">
173&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))&nbsp;(member?&nbsp;MORE&nbsp;&#x27;(&quot;more&quot;&nbsp;&quot;greater&quot;))&nbsp;(=&nbsp;THAN&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
174&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[value&nbsp;remainder]&nbsp;(parse-value&nbsp;rest&nbsp;true)]
</span><br/>
<span class="covered" title="13 out of 13 forms covered">
175&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;&gt;&nbsp;(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;property))&nbsp;value)&nbsp;remainder])))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
176&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
177&nbsp;&nbsp;(defn-&nbsp;parse-between-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
178&nbsp;&nbsp;&nbsp;&nbsp;[[p&nbsp;IS&nbsp;BETWEEN&nbsp;v1&nbsp;AND&nbsp;v2&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="27 out of 29 forms covered">
179&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))&nbsp;(=&nbsp;BETWEEN&nbsp;&quot;between&quot;)&nbsp;(=&nbsp;AND&nbsp;&quot;and&quot;)&nbsp;(not&nbsp;(nil?&nbsp;v2)))
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[property&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;p)&nbsp;true))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
181&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value1&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;v1)&nbsp;true))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
182&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value2&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;v2)&nbsp;true))]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
183&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;or
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
184&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;&lt;&nbsp;value1&nbsp;property&nbsp;value2)
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
185&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;&gt;&nbsp;value1&nbsp;property&nbsp;value2))&nbsp;rest])))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
186&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
187&nbsp;&nbsp;(defn-&nbsp;parse-is-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
188&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;clauses&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;x&nbsp;is&nbsp;y&#x27;,&nbsp;&#x27;x&nbsp;is&nbsp;in&nbsp;y&nbsp;or&nbsp;z...&#x27;,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
189&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#x27;x&nbsp;is&nbsp;between&nbsp;y&nbsp;and&nbsp;z&#x27;,&nbsp;&#x27;x&nbsp;is&nbsp;more&nbsp;than&nbsp;y&#x27;&nbsp;or&nbsp;&#x27;x&nbsp;is&nbsp;less&nbsp;than&nbsp;y&#x27;.
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
190&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;It&nbsp;is&nbsp;necessary&nbsp;to&nbsp;disambiguate&nbsp;whether&nbsp;value&nbsp;is&nbsp;a&nbsp;numeric&nbsp;or&nbsp;keyword.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
191&nbsp;&nbsp;&nbsp;&nbsp;[[property&nbsp;IS&nbsp;value&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="1 out of 2 forms covered">
192&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
193&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
194&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[tokens&nbsp;(cons&nbsp;property&nbsp;(cons&nbsp;value&nbsp;rest))]
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
195&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="19 out of 19 forms covered">
196&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(re-matches&nbsp;re-number&nbsp;value)&nbsp;[(list&nbsp;&#x27;=&nbsp;(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;property))&nbsp;(read-string&nbsp;value))&nbsp;rest]
</span><br/>
<span class="covered" title="15 out of 15 forms covered">
197&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;[(list&nbsp;&#x27;=&nbsp;(list&nbsp;(keyword&nbsp;property)&nbsp;&#x27;cell)&nbsp;(keyword&nbsp;value))&nbsp;rest]))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
198&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
199&nbsp;&nbsp;(defn-&nbsp;parse-not-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
200&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;the&nbsp;negation&nbsp;of&nbsp;a&nbsp;simple&nbsp;condition.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
201&nbsp;&nbsp;&nbsp;&nbsp;[[property&nbsp;IS&nbsp;NOT&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="12 out of 13 forms covered">
202&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(member?&nbsp;IS&nbsp;&#x27;(&quot;is&quot;&nbsp;&quot;are&quot;))&nbsp;(=&nbsp;NOT&nbsp;&quot;not&quot;))
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
203&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[partial&nbsp;(parse-simple-condition&nbsp;(cons&nbsp;property&nbsp;(cons&nbsp;&quot;is&quot;&nbsp;rest)))]
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
204&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;partial
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
205&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[condition&nbsp;remainder]&nbsp;partial]
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
206&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;not&nbsp;condition)&nbsp;remainder])))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
207&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
208&nbsp;&nbsp;(defn-&nbsp;gen-neighbours-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
209&nbsp;&nbsp;&nbsp;&nbsp;([comp1&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;comp2&nbsp;distance]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;comp1
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
211&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;count
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
212&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;get-neighbours-with-property-value&nbsp;&#x27;world
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
213&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#x27;(cell&nbsp;:x)&nbsp;&#x27;(cell&nbsp;:y)&nbsp;distance
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
214&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(keyword&nbsp;property)&nbsp;(keyword-or-numeric&nbsp;value)&nbsp;comp2))
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
215&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quantity)
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
216&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;remainder])
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
217&nbsp;&nbsp;&nbsp;&nbsp;([comp1&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;comp2]
</span><br/>
<span class="not-covered" title="0 out of 9 forms covered">
218&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;comp1&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;comp2&nbsp;1)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
219&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
220&nbsp;&nbsp;(defn&nbsp;parse-comparator-neighbours-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
221&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;conditions&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;...more&nbsp;than&nbsp;6&nbsp;neighbours&nbsp;are&nbsp;[condition]&#x27;&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
222&nbsp;&nbsp;&nbsp;&nbsp;[[MORE&nbsp;THAN&nbsp;n&nbsp;NEIGHBOURS&nbsp;WITHIN&nbsp;distance&nbsp;have-or-are&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
223&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[quantity&nbsp;(first&nbsp;(parse-numeric-value&nbsp;(list&nbsp;n)))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
224&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comparator&nbsp;(cond&nbsp;(=&nbsp;MORE&nbsp;&quot;more&quot;)&nbsp;&#x27;&gt;
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
225&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(member?&nbsp;MORE&nbsp;&#x27;(&quot;fewer&quot;&nbsp;&quot;less&quot;))&nbsp;&#x27;&lt;)]
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
226&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
227&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(not=&nbsp;WITHIN&nbsp;&quot;within&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
228&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-comparator-neighbours-condition
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
229&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(flatten
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
230&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;two&nbsp;tokens&nbsp;were&nbsp;mis-parsed&nbsp;as&nbsp;&#x27;within&nbsp;distance&#x27;&nbsp;that&nbsp;weren&#x27;t
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
231&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;actually&nbsp;&#x27;within&#x27;&nbsp;and&nbsp;a&nbsp;distance.&nbsp;Splice&nbsp;in&nbsp;&#x27;within&nbsp;1&#x27;&nbsp;and&nbsp;try
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
232&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;again.
</span><br/>
<span class="covered" title="12 out of 12 forms covered">
233&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;MORE&nbsp;THAN&nbsp;n&nbsp;NEIGHBOURS&nbsp;&quot;within&quot;&nbsp;&quot;1&quot;&nbsp;WITHIN&nbsp;distance&nbsp;have-or-are&nbsp;rest)))
</span><br/>
<span class="partial" title="14 out of 15 forms covered">
234&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;quantity
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
235&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;comparator
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
236&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;THAN&nbsp;&quot;than&quot;)
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
237&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;NEIGHBOURS&nbsp;&quot;neighbours&quot;))
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
238&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
239&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;have-or-are&nbsp;&quot;are&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
240&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[value&nbsp;&amp;&nbsp;remainder]&nbsp;rest
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
241&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&nbsp;(gen-token-value&nbsp;distance&nbsp;true)]
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
242&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;comparator&nbsp;quantity&nbsp;:state&nbsp;value&nbsp;remainder&nbsp;=&nbsp;dist))
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
243&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;have-or-are&nbsp;&quot;have&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
244&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[property&nbsp;comp1&nbsp;comp2&nbsp;value&nbsp;&amp;&nbsp;remainder]&nbsp;rest
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
245&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&nbsp;(gen-token-value&nbsp;distance&nbsp;true)]
</span><br/>
<span class="partial" title="13 out of 14 forms covered">
246&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;equal&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;to&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
247&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;comparator&nbsp;quantity&nbsp;property
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
248&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;remainder&nbsp;=&nbsp;dist)
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
249&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;more&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
250&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;comparator&nbsp;quantity&nbsp;property
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
251&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;remainder&nbsp;&gt;&nbsp;dist)
</span><br/>
<span class="partial" title="9 out of 10 forms covered">
252&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;less&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
253&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;comparator&nbsp;quantity&nbsp;property
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
254&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value&nbsp;remainder&nbsp;&lt;&nbsp;dist)
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
255&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
256&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
257&nbsp;&nbsp;(defn&nbsp;parse-some-neighbours-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
258&nbsp;&nbsp;&nbsp;&nbsp;[[SOME&nbsp;NEIGHBOURS&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
259&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
260&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;SOME&nbsp;&quot;some&quot;)&nbsp;(=&nbsp;NEIGHBOURS&nbsp;&quot;neighbours&quot;))
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
261&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-comparator-neighbours-condition&nbsp;(concat&nbsp;&#x27;(&quot;more&quot;&nbsp;&quot;than&quot;&nbsp;&quot;0&quot;&nbsp;&quot;neighbours&quot;)&nbsp;rest))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
262&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
263&nbsp;&nbsp;(defn&nbsp;parse-simple-neighbours-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
264&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;conditions&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;...6&nbsp;neighbours&nbsp;are&nbsp;[condition]&#x27;&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
265&nbsp;&nbsp;&nbsp;&nbsp;[[n&nbsp;NEIGHBOURS&nbsp;WITHIN&nbsp;distance&nbsp;have-or-are&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
266&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[quantity&nbsp;(first&nbsp;(parse-numeric-value&nbsp;(list&nbsp;n)))]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
267&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
268&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;quantity&nbsp;(=&nbsp;NEIGHBOURS&nbsp;&quot;neighbours&quot;))
</span><br/>
<span class="partial" title="3 out of 4 forms covered">
269&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
270&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(not=&nbsp;WITHIN&nbsp;&quot;within&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
271&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-simple-neighbours-condition
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
272&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(flatten
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
273&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;two&nbsp;tokens&nbsp;were&nbsp;mis-parsed&nbsp;as&nbsp;&#x27;within&nbsp;distance&#x27;&nbsp;that&nbsp;weren&#x27;t
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
274&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;actually&nbsp;&#x27;within&#x27;&nbsp;and&nbsp;a&nbsp;distance.&nbsp;Splice&nbsp;in&nbsp;&#x27;within&nbsp;1&#x27;&nbsp;and&nbsp;try
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
275&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;again.
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
276&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;n&nbsp;NEIGHBOURS&nbsp;&quot;within&quot;&nbsp;&quot;1&quot;&nbsp;WITHIN&nbsp;distance&nbsp;have-or-are&nbsp;rest)))
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
277&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;have-or-are&nbsp;&quot;are&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
278&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[value&nbsp;&amp;&nbsp;remainder]&nbsp;rest
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
279&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&nbsp;(gen-token-value&nbsp;distance&nbsp;true)]
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
280&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;&#x27;=&nbsp;quantity&nbsp;:state&nbsp;value&nbsp;remainder&nbsp;=&nbsp;dist))
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
281&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;have-or-are&nbsp;&quot;have&quot;)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
282&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[property&nbsp;comp1&nbsp;comp2&nbsp;value&nbsp;&amp;&nbsp;remainder]&nbsp;rest
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
283&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist&nbsp;(gen-token-value&nbsp;distance&nbsp;true)]
</span><br/>
<span class="partial" title="13 out of 14 forms covered">
284&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;equal&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;to&quot;))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
285&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;&#x27;=&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;=
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
286&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist)
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
287&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;more&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
288&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;&#x27;=&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;&gt;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
289&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist)
</span><br/>
<span class="partial" title="9 out of 10 forms covered">
290&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;comp1&nbsp;&quot;less&quot;)&nbsp;(=&nbsp;comp2&nbsp;&quot;than&quot;))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
291&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(gen-neighbours-condition&nbsp;&#x27;=&nbsp;quantity&nbsp;property&nbsp;value&nbsp;remainder&nbsp;&lt;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
292&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dist)
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
293&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
294&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
295&nbsp;&nbsp;(defn&nbsp;parse-neighbours-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
296&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;conditions&nbsp;referring&nbsp;to&nbsp;neighbours&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
297&nbsp;&nbsp;&nbsp;&nbsp;[tokens]
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
298&nbsp;&nbsp;&nbsp;&nbsp;(or
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
299&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-simple-neighbours-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-comparator-neighbours-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-some-neighbours-condition&nbsp;tokens)
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
302&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
303&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
304&nbsp;&nbsp;(defn&nbsp;parse-simple-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
305&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;conditions&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;[property]&nbsp;[comparison]&nbsp;[value]&#x27;.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
306&nbsp;&nbsp;&nbsp;&nbsp;[tokens]
</span><br/>
<span class="covered" title="25 out of 25 forms covered">
307&nbsp;&nbsp;&nbsp;&nbsp;(or
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
308&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-neighbours-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
309&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-member-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
310&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-not-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
311&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-less-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
312&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-more-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
313&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-between-condition&nbsp;tokens)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
314&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-is-condition&nbsp;tokens)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
315&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
316&nbsp;&nbsp;(defn-&nbsp;parse-disjunction-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
317&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;&#x27;...&nbsp;or&nbsp;[condition]&#x27;&nbsp;from&nbsp;`tokens`,&nbsp;where&nbsp;`left`&nbsp;is&nbsp;the&nbsp;already&nbsp;parsed&nbsp;first&nbsp;disjunct.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
318&nbsp;&nbsp;&nbsp;&nbsp;[left&nbsp;tokens]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
319&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[partial&nbsp;(parse-conditions&nbsp;tokens)]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
320&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;partial
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
321&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[right&nbsp;remainder]&nbsp;partial]
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
322&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;or&nbsp;left&nbsp;right)&nbsp;remainder]))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
323&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
324&nbsp;&nbsp;(defn-&nbsp;parse-conjunction-condition
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
325&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;&#x27;...&nbsp;and&nbsp;[condition]&#x27;&nbsp;from&nbsp;`tokens`,&nbsp;where&nbsp;`left`&nbsp;is&nbsp;the&nbsp;already&nbsp;parsed&nbsp;first&nbsp;conjunct.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
326&nbsp;&nbsp;&nbsp;&nbsp;[left&nbsp;tokens]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
327&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[partial&nbsp;(parse-conditions&nbsp;tokens)]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
328&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;partial
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
329&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[right&nbsp;remainder]&nbsp;partial]
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
330&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;and&nbsp;left&nbsp;right)&nbsp;remainder]))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
331&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
332&nbsp;&nbsp;(defn-&nbsp;parse-conditions
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
333&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;conditions&nbsp;from&nbsp;`tokens`,&nbsp;where&nbsp;conditions&nbsp;may&nbsp;be&nbsp;linked&nbsp;by&nbsp;either&nbsp;&#x27;and&#x27;&nbsp;or&nbsp;&#x27;or&#x27;.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
334&nbsp;&nbsp;&nbsp;&nbsp;[tokens]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
335&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[partial&nbsp;(parse-simple-condition&nbsp;tokens)]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
336&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;partial
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
337&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[left&nbsp;[next&nbsp;&amp;&nbsp;remainder]]&nbsp;partial]
</span><br/>
<span class="partial" title="4 out of 5 forms covered">
338&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
339&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;next&nbsp;&quot;and&quot;)&nbsp;(parse-conjunction-condition&nbsp;left&nbsp;remainder)
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
340&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;next&nbsp;&quot;or&quot;)&nbsp;(parse-disjunction-condition&nbsp;left&nbsp;remainder)
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
341&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;partial)))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
342&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
343&nbsp;&nbsp;(defn-&nbsp;parse-left-hand-side
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
344&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;the&nbsp;left&nbsp;hand&nbsp;side&nbsp;(&#x27;if...&#x27;)&nbsp;of&nbsp;a&nbsp;production&nbsp;rule.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
345&nbsp;&nbsp;&nbsp;[[IF&nbsp;&amp;&nbsp;tokens]]
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
346&nbsp;&nbsp;&nbsp;(if
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
347&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;IF&nbsp;&quot;if&quot;)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
348&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-conditions&nbsp;tokens)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
349&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
350&nbsp;&nbsp;(defn-&nbsp;parse-arithmetic-action
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
351&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;actions&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;[property]&nbsp;should&nbsp;be&nbsp;[property]&nbsp;[arithmetic-operator]&nbsp;[value]&#x27;,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
352&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.g.&nbsp;&#x27;fertility&nbsp;should&nbsp;be&nbsp;fertility&nbsp;+&nbsp;1&#x27;,&nbsp;or&nbsp;&#x27;deer&nbsp;should&nbsp;be&nbsp;deer&nbsp;-&nbsp;wolves&#x27;.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
353&nbsp;&nbsp;&nbsp;&nbsp;[previous&nbsp;[prop1&nbsp;SHOULD&nbsp;BE&nbsp;prop2&nbsp;operator&nbsp;value&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
354&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
355&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(member?&nbsp;prop1&nbsp;&#x27;(&quot;x&quot;&nbsp;&quot;y&quot;))
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
356&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
357&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Exception.&nbsp;reserved-properties-error))
</span><br/>
<span class="partial" title="10 out of 12 forms covered">
358&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;SHOULD&nbsp;&quot;should&quot;)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
359&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(=&nbsp;BE&nbsp;&quot;be&quot;)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
360&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(member?&nbsp;operator&nbsp;&#x27;(&quot;+&quot;&nbsp;&quot;-&quot;&nbsp;&quot;*&quot;&nbsp;&quot;&#x2F;&quot;)))
</span><br/>
<span class="partial" title="9 out of 10 forms covered">
361&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;merge&nbsp;(or&nbsp;previous&nbsp;&#x27;cell)
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
362&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{(keyword&nbsp;prop1)&nbsp;(list&nbsp;&#x27;int
</span><br/>
<span class="covered" title="12 out of 12 forms covered">
363&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;(symbol&nbsp;operator)&nbsp;(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;prop2))
</span><br/>
<span class="partial" title="3 out of 4 forms covered">
364&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="7 out of 7 forms covered">
365&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(re-matches&nbsp;re-number&nbsp;value)&nbsp;(read-string&nbsp;value)
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
366&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;(list&nbsp;&#x27;get-int&nbsp;&#x27;cell&nbsp;(keyword&nbsp;value)))))})&nbsp;rest]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
367&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
368&nbsp;&nbsp;(defn-&nbsp;parse-set-action
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
369&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;actions&nbsp;of&nbsp;the&nbsp;form&nbsp;&#x27;[property]&nbsp;should&nbsp;be&nbsp;[value].&#x27;&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
370&nbsp;&nbsp;&nbsp;&nbsp;[previous&nbsp;[property&nbsp;SHOULD&nbsp;BE&nbsp;value&nbsp;&amp;&nbsp;rest]]
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
371&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
372&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(member?&nbsp;property&nbsp;&#x27;(&quot;x&quot;&nbsp;&quot;y&quot;))
</span><br/>
<span class="not-covered" title="0 out of 1 forms covered">
373&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(throw
</span><br/>
<span class="not-covered" title="0 out of 2 forms covered">
374&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Exception.&nbsp;reserved-properties-error))
</span><br/>
<span class="partial" title="9 out of 10 forms covered">
375&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;SHOULD&nbsp;&quot;should&quot;)&nbsp;(=&nbsp;BE&nbsp;&quot;be&quot;))
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
376&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;merge&nbsp;(or&nbsp;previous&nbsp;&#x27;cell)
</span><br/>
<span class="partial" title="18 out of 19 forms covered">
377&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{(keyword&nbsp;property)&nbsp;(cond&nbsp;(re-matches&nbsp;re-number&nbsp;value)&nbsp;(read-string&nbsp;value)&nbsp;true&nbsp;(keyword&nbsp;value))})&nbsp;rest]))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
378&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
379&nbsp;&nbsp;(defn-&nbsp;parse-simple-action&nbsp;[previous&nbsp;tokens]
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
380&nbsp;&nbsp;&nbsp;&nbsp;(or&nbsp;(parse-arithmetic-action&nbsp;previous&nbsp;tokens)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
381&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-set-action&nbsp;previous&nbsp;tokens)))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
382&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
383&nbsp;&nbsp;(defn-&nbsp;parse-actions
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
384&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;actions&nbsp;from&nbsp;tokens.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
385&nbsp;&nbsp;&nbsp;&nbsp;[previous&nbsp;tokens]
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
386&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[left&nbsp;remainder]&nbsp;(parse-simple-action&nbsp;previous&nbsp;tokens)]
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
387&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;left
</span><br/>
<span class="partial" title="8 out of 9 forms covered">
388&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;(=&nbsp;(first&nbsp;remainder)&nbsp;&quot;and&quot;)
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
389&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-actions&nbsp;left&nbsp;(rest&nbsp;remainder))
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
390&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;(list&nbsp;left)))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
391&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
392&nbsp;&nbsp;(defn-&nbsp;parse-probability
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
393&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;probability&nbsp;of&nbsp;an&nbsp;action&nbsp;from&nbsp;this&nbsp;collection&nbsp;of&nbsp;tokens&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
394&nbsp;&nbsp;&nbsp;&nbsp;[previous&nbsp;[n&nbsp;CHANCE&nbsp;IN&nbsp;m&nbsp;&amp;&nbsp;tokens]]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
395&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="10 out of 10 forms covered">
396&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;(=&nbsp;CHANCE&nbsp;&quot;chance&quot;)(=&nbsp;IN&nbsp;&quot;in&quot;))
</span><br/>
<span class="covered" title="5 out of 5 forms covered">
397&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[action&nbsp;remainder]&nbsp;(parse-actions&nbsp;previous&nbsp;tokens)]
</span><br/>
<span class="partial" title="2 out of 3 forms covered">
398&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;action
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
399&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[(list&nbsp;&#x27;cond
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;&lt;
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
401&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;rand
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
402&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;m)&nbsp;true)))
</span><br/>
<span class="covered" title="8 out of 8 forms covered">
403&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(first&nbsp;(parse-simple-value&nbsp;(list&nbsp;n)&nbsp;true)))
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
404&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;action)&nbsp;remainder]))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
405&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
406&nbsp;&nbsp;(defn-&nbsp;parse-right-hand-side
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
407&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;the&nbsp;right&nbsp;hand&nbsp;side&nbsp;(&#x27;then...&#x27;)&nbsp;of&nbsp;a&nbsp;production&nbsp;rule.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
408&nbsp;&nbsp;&nbsp;&nbsp;[[THEN&nbsp;&amp;&nbsp;tokens]]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
409&nbsp;&nbsp;&nbsp;&nbsp;(if&nbsp;(=&nbsp;THEN&nbsp;&quot;then&quot;)
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
410&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(or
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
411&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-probability&nbsp;nil&nbsp;tokens)
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
412&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(parse-actions&nbsp;nil&nbsp;tokens))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
413&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
414&nbsp;&nbsp;(defn&nbsp;parse-rule
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
415&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;a&nbsp;complete&nbsp;rule&nbsp;from&nbsp;this&nbsp;`line`,&nbsp;expected&nbsp;to&nbsp;be&nbsp;either&nbsp;a&nbsp;string&nbsp;or&nbsp;a
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
416&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sequence&nbsp;of&nbsp;string&nbsp;tokens.&nbsp;Return&nbsp;the&nbsp;rule&nbsp;in&nbsp;the&nbsp;form&nbsp;of&nbsp;an&nbsp;S-expression.
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
417&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
418&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throws&nbsp;an&nbsp;exception&nbsp;if&nbsp;parsing&nbsp;fails.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
419&nbsp;&nbsp;&nbsp;&nbsp;[line]
</span><br/>
<span class="partial" title="3 out of 4 forms covered">
420&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
421&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(string?&nbsp;line)
</span><br/>
<span class="covered" title="9 out of 9 forms covered">
422&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[rule&nbsp;(parse-rule&nbsp;(split&nbsp;(triml&nbsp;line)&nbsp;#&quot;\s+&quot;))]
</span><br/>
<span class="partial" title="5 out of 6 forms covered">
423&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond&nbsp;rule&nbsp;rule
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
424&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;(throw&nbsp;(Exception.&nbsp;(format&nbsp;bad-parse-error&nbsp;line)))))
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
425&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
426&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[[left&nbsp;remainder]&nbsp;(parse-left-hand-side&nbsp;line)
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
427&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[right&nbsp;junk]&nbsp;(parse-right-hand-side&nbsp;remainder)]
</span><br/>
<span class="covered" title="2 out of 2 forms covered">
428&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
429&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;there&nbsp;should&nbsp;be&nbsp;a&nbsp;valide&nbsp;left&nbsp;hand&nbsp;side&nbsp;and&nbsp;a&nbsp;valid&nbsp;right&nbsp;hand&nbsp;side
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
430&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;;&nbsp;there&nbsp;shouldn&#x27;t&nbsp;be&nbsp;anything&nbsp;left&nbsp;over&nbsp;(junk&nbsp;should&nbsp;be&nbsp;empty)
</span><br/>
<span class="partial" title="12 out of 13 forms covered">
431&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;left&nbsp;right&nbsp;(empty?&nbsp;junk))
</span><br/>
<span class="covered" title="11 out of 11 forms covered">
432&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(list&nbsp;&#x27;fn&nbsp;[&#x27;cell&nbsp;&#x27;world]&nbsp;(list&nbsp;&#x27;if&nbsp;left&nbsp;right))))))
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
433&nbsp;&nbsp;
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
434&nbsp;&nbsp;(defn&nbsp;compile-rule
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
435&nbsp;&nbsp;&nbsp;&nbsp;&quot;Parse&nbsp;this&nbsp;`rule-text`,&nbsp;a&nbsp;string&nbsp;conforming&nbsp;to&nbsp;the&nbsp;grammar&nbsp;of&nbsp;MicroWorld&nbsp;rules,
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
436&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;into&nbsp;Clojure&nbsp;source,&nbsp;and&nbsp;then&nbsp;compile&nbsp;it&nbsp;into&nbsp;an&nbsp;anonymous
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
437&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;object,&nbsp;getting&nbsp;round&nbsp;the&nbsp;problem&nbsp;of&nbsp;binding&nbsp;mw-engine.utils&nbsp;in
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
438&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;compiling&nbsp;environment.&nbsp;If&nbsp;`return-tuple?`&nbsp;is&nbsp;present&nbsp;and&nbsp;true,&nbsp;return
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
439&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;list&nbsp;comprising&nbsp;the&nbsp;anonymous&nbsp;function&nbsp;compiled,&nbsp;and&nbsp;the&nbsp;function&nbsp;from
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
440&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;it&nbsp;was&nbsp;compiled.
</span><br/>
<span class="blank" title="0 out of 0 forms covered">
441&nbsp;&nbsp;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
442&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Throws&nbsp;an&nbsp;exception&nbsp;if&nbsp;parsing&nbsp;fails.&quot;
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
443&nbsp;&nbsp;&nbsp;&nbsp;([rule-text&nbsp;return-tuple?]
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
444&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(do
</span><br/>
<span class="covered" title="3 out of 3 forms covered">
445&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(use&nbsp;&#x27;mw-engine.utils)
</span><br/>
<span class="covered" title="6 out of 6 forms covered">
446&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(let&nbsp;[afn&nbsp;(eval&nbsp;(parse-rule&nbsp;rule-text))]
</span><br/>
<span class="partial" title="3 out of 4 forms covered">
447&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(cond
</span><br/>
<span class="partial" title="11 out of 12 forms covered">
448&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and&nbsp;afn&nbsp;return-tuple?)(list&nbsp;afn&nbsp;(trim&nbsp;rule-text))
</span><br/>
<span class="covered" title="1 out of 1 forms covered">
449&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;true&nbsp;afn))))
</span><br/>
<span class="not-tracked" title="0 out of 0 forms covered">
450&nbsp;&nbsp;&nbsp;&nbsp;([rule-text]
</span><br/>
<span class="covered" title="4 out of 4 forms covered">
451&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(compile-rule&nbsp;rule-text&nbsp;false)))
</span><br/>
</body>
</html>