about summary refs log tree commit diff stats
path: root/html/030container.cc.html
diff options
context:
space:
mode:
Diffstat (limited to 'html/030container.cc.html')
-rw-r--r--html/030container.cc.html1806
1 files changed, 903 insertions, 903 deletions
diff --git a/html/030container.cc.html b/html/030container.cc.html
index f94ee2e0..2d62580d 100644
--- a/html/030container.cc.html
+++ b/html/030container.cc.html
@@ -61,909 +61,909 @@ if ('onhashchange' in window) {
 </head>
 <body onload='JumpToLine();'>
 <pre id='vimCodeElement'>
-<a name="L1"></a><span id="L1" class="LineNr">  1 </span><span class="Comment">//: Containers contain a fixed number of elements of different types.</span>
-<a name="L2"></a><span id="L2" class="LineNr">  2 </span>
-<a name="L3"></a><span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-<a name="L4"></a><span id="L4" class="LineNr">  4 </span><span class="Comment">//: We'll use this container as a running example in scenarios below.</span>
-<a name="L5"></a><span id="L5" class="LineNr">  5 </span>type_ordinal point = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-<a name="L6"></a><span id="L6" class="LineNr">  6 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
-<a name="L7"></a><span id="L7" class="LineNr">  7 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
-<a name="L8"></a><span id="L8" class="LineNr">  8 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>name = <span class="Constant">&quot;point&quot;</span><span class="Delimiter">;</span>
-<a name="L9"></a><span id="L9" class="LineNr">  9 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">));</span>
-<a name="L10"></a><span id="L10" class="LineNr"> 10 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;y:number&quot;</span><span class="Delimiter">));</span>
-<a name="L11"></a><span id="L11" class="LineNr"> 11 </span>
-<a name="L12"></a><span id="L12" class="LineNr"> 12 </span><span class="Comment">//: Containers can be copied around with a single instruction just like</span>
-<a name="L13"></a><span id="L13" class="LineNr"> 13 </span><span class="Comment">//: numbers, no matter how large they are.</span>
-<a name="L14"></a><span id="L14" class="LineNr"> 14 </span>
-<a name="L15"></a><span id="L15" class="LineNr"> 15 </span><span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as a</span>
-<a name="L16"></a><span id="L16" class="LineNr"> 16 </span><span class="Comment">//: container. Don't do this in general. I'm tagging exceptions with /unsafe to</span>
-<a name="L17"></a><span id="L17" class="LineNr"> 17 </span><span class="Comment">//: skip later checks.</span>
-<a name="L18"></a><span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario copy_multiple_locations)</span>
-<a name="L19"></a><span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [
-<a name="L20"></a><span id="L20" class="LineNr"> 20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L21"></a><span id="L21" class="LineNr"> 21 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L22"></a><span id="L22" class="LineNr"> 22 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:point/unsafe
-<a name="L23"></a><span id="L23" class="LineNr"> 23 </span>]
-<a name="L24"></a><span id="L24" class="LineNr"> 24 </span><span class="traceContains">+mem: storing 34 in location 3</span>
-<a name="L25"></a><span id="L25" class="LineNr"> 25 </span><span class="traceContains">+mem: storing 35 in location 4</span>
-<a name="L26"></a><span id="L26" class="LineNr"> 26 </span>
-<a name="L27"></a><span id="L27" class="LineNr"> 27 </span><span class="Comment">//: trying to copy to a differently-typed destination will fail</span>
-<a name="L28"></a><span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(scenario copy_checks_size)</span>
-<a name="L29"></a><span id="L29" class="LineNr"> 29 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L30"></a><span id="L30" class="LineNr"> 30 </span><span class="muRecipe">def</span> main [
-<a name="L31"></a><span id="L31" class="LineNr"> 31 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
-<a name="L32"></a><span id="L32" class="LineNr"> 32 </span>]
-<a name="L33"></a><span id="L33" class="LineNr"> 33 </span><span class="traceContains">+error: main: can't copy '1:num' to '2:point'; types don't match</span>
-<a name="L34"></a><span id="L34" class="LineNr"> 34 </span>
-<a name="L35"></a><span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
-<a name="L36"></a><span id="L36" class="LineNr"> 36 </span><span class="Comment">// A more complex example container, containing another container as one of</span>
-<a name="L37"></a><span id="L37" class="LineNr"> 37 </span><span class="Comment">// its elements.</span>
-<a name="L38"></a><span id="L38" class="LineNr"> 38 </span>type_ordinal point_number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-<a name="L39"></a><span id="L39" class="LineNr"> 39 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
-<a name="L40"></a><span id="L40" class="LineNr"> 40 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
-<a name="L41"></a><span id="L41" class="LineNr"> 41 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>name = <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">;</span>
-<a name="L42"></a><span id="L42" class="LineNr"> 42 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;xy:point&quot;</span><span class="Delimiter">));</span>
-<a name="L43"></a><span id="L43" class="LineNr"> 43 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;z:number&quot;</span><span class="Delimiter">));</span>
-<a name="L44"></a><span id="L44" class="LineNr"> 44 </span>
-<a name="L45"></a><span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario copy_handles_nested_container_elements)</span>
-<a name="L46"></a><span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [
-<a name="L47"></a><span id="L47" class="LineNr"> 47 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L48"></a><span id="L48" class="LineNr"> 48 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L49"></a><span id="L49" class="LineNr"> 49 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L50"></a><span id="L50" class="LineNr"> 50 </span>  <span class="Constant">15</span>:point-number<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point-number/unsafe
-<a name="L51"></a><span id="L51" class="LineNr"> 51 </span>]
-<a name="L52"></a><span id="L52" class="LineNr"> 52 </span><span class="traceContains">+mem: storing 36 in location 17</span>
-<a name="L53"></a><span id="L53" class="LineNr"> 53 </span>
-<a name="L54"></a><span id="L54" class="LineNr"> 54 </span><span class="Comment">//: products of recipes can include containers</span>
-<a name="L55"></a><span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario return_container)</span>
-<a name="L56"></a><span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [
-<a name="L57"></a><span id="L57" class="LineNr"> 57 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
-<a name="L58"></a><span id="L58" class="LineNr"> 58 </span>]
-<a name="L59"></a><span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> f [
-<a name="L60"></a><span id="L60" class="LineNr"> 60 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
-<a name="L61"></a><span id="L61" class="LineNr"> 61 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L62"></a><span id="L62" class="LineNr"> 62 </span>  <span class="Identifier">return</span> <span class="Constant">12</span>:point/<span class="Special">raw</span>
-<a name="L63"></a><span id="L63" class="LineNr"> 63 </span>]
-<a name="L64"></a><span id="L64" class="LineNr"> 64 </span><span class="traceContains">+run: result 0 is [2, 35]</span>
-<a name="L65"></a><span id="L65" class="LineNr"> 65 </span><span class="traceContains">+mem: storing 2 in location 3</span>
-<a name="L66"></a><span id="L66" class="LineNr"> 66 </span><span class="traceContains">+mem: storing 35 in location 4</span>
-<a name="L67"></a><span id="L67" class="LineNr"> 67 </span>
-<a name="L68"></a><span id="L68" class="LineNr"> 68 </span><span class="Comment">//: Containers can be checked for equality with a single instruction just like</span>
-<a name="L69"></a><span id="L69" class="LineNr"> 69 </span><span class="Comment">//: numbers, no matter how large they are.</span>
-<a name="L70"></a><span id="L70" class="LineNr"> 70 </span>
-<a name="L71"></a><span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario compare_multiple_locations)</span>
-<a name="L72"></a><span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [
-<a name="L73"></a><span id="L73" class="LineNr"> 73 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-<a name="L74"></a><span id="L74" class="LineNr"> 74 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L75"></a><span id="L75" class="LineNr"> 75 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L76"></a><span id="L76" class="LineNr"> 76 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
-<a name="L77"></a><span id="L77" class="LineNr"> 77 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L78"></a><span id="L78" class="LineNr"> 78 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L79"></a><span id="L79" class="LineNr"> 79 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
-<a name="L80"></a><span id="L80" class="LineNr"> 80 </span>]
-<a name="L81"></a><span id="L81" class="LineNr"> 81 </span><span class="traceContains">+mem: storing 1 in location 7</span>
-<a name="L82"></a><span id="L82" class="LineNr"> 82 </span>
-<a name="L83"></a><span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario compare_multiple_locations_2)</span>
-<a name="L84"></a><span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> main [
-<a name="L85"></a><span id="L85" class="LineNr"> 85 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-<a name="L86"></a><span id="L86" class="LineNr"> 86 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L87"></a><span id="L87" class="LineNr"> 87 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L88"></a><span id="L88" class="LineNr"> 88 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
-<a name="L89"></a><span id="L89" class="LineNr"> 89 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L90"></a><span id="L90" class="LineNr"> 90 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">37</span>  <span class="Comment"># different</span>
-<a name="L91"></a><span id="L91" class="LineNr"> 91 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
-<a name="L92"></a><span id="L92" class="LineNr"> 92 </span>]
-<a name="L93"></a><span id="L93" class="LineNr"> 93 </span><span class="traceContains">+mem: storing 0 in location 7</span>
-<a name="L94"></a><span id="L94" class="LineNr"> 94 </span>
-<a name="L95"></a><span id="L95" class="LineNr"> 95 </span><span class="Comment">//: Can't put this in type_info because later layers will add support for more</span>
-<a name="L96"></a><span id="L96" class="LineNr"> 96 </span><span class="Comment">//: complex type trees where metadata depends on *combinations* of types.</span>
-<a name="L97"></a><span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
-<a name="L98"></a><span id="L98" class="LineNr"> 98 </span><span class="Normal">struct</span> container_metadata <span class="Delimiter">{</span>
-<a name="L99"></a><span id="L99" class="LineNr"> 99 </span>  <span class="Normal">int</span> size<span class="Delimiter">;</span>
-<a name="L100"></a><span id="L100" class="LineNr">100 </span>  vector&lt;<span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>  <span class="Comment">// not used by exclusive containers</span>
-<a name="L101"></a><span id="L101" class="LineNr">101 </span>  <span class="Comment">// End container_metadata Fields</span>
-<a name="L102"></a><span id="L102" class="LineNr">102 </span>  container_metadata<span class="Delimiter">()</span> :size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L103"></a><span id="L103" class="LineNr">103 </span>    <span class="Comment">// End container_metadata Constructor</span>
-<a name="L104"></a><span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
-<a name="L105"></a><span id="L105" class="LineNr">105 </span><span class="Delimiter">};</span>
-<a name="L106"></a><span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before &quot;End reagent Fields&quot;)</span>
-<a name="L107"></a><span id="L107" class="LineNr">107 </span>container_metadata metadata<span class="Delimiter">;</span>  <span class="Comment">// can't be a pointer into Container_metadata because we keep changing the base storage when we save/restore snapshots</span>
-<a name="L108"></a><span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End reagent Copy Operator&quot;)</span>
-<a name="L109"></a><span id="L109" class="LineNr">109 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
-<a name="L110"></a><span id="L110" class="LineNr">110 </span><span class="Delimiter">:(before &quot;End reagent Copy Constructor&quot;)</span>
-<a name="L111"></a><span id="L111" class="LineNr">111 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
-<a name="L112"></a><span id="L112" class="LineNr">112 </span>
-<a name="L113"></a><span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
-<a name="L114"></a><span id="L114" class="LineNr">114 </span><span class="Comment">// todo: switch to map after figuring out how to consistently compare type trees</span>
-<a name="L115"></a><span id="L115" class="LineNr">115 </span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt; Container_metadata<span class="Delimiter">,</span> Container_metadata_snapshot<span class="Delimiter">;</span>
-<a name="L116"></a><span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
-<a name="L117"></a><span id="L117" class="LineNr">117 </span>Container_metadata_snapshot = Container_metadata<span class="Delimiter">;</span>
-<a name="L118"></a><span id="L118" class="LineNr">118 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
-<a name="L119"></a><span id="L119" class="LineNr">119 </span>restore_container_metadata<span class="Delimiter">();</span>
-<a name="L120"></a><span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
-<a name="L121"></a><span id="L121" class="LineNr">121 </span>atexit<span class="Delimiter">(</span>clear_container_metadata<span class="Delimiter">);</span>
-<a name="L122"></a><span id="L122" class="LineNr">122 </span><span class="Delimiter">:(code)</span>
-<a name="L123"></a><span id="L123" class="LineNr">123 </span><span class="Comment">// invariant: Container_metadata always contains a superset of Container_metadata_snapshot</span>
-<a name="L124"></a><span id="L124" class="LineNr">124 </span><span class="Normal">void</span> restore_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L125"></a><span id="L125" class="LineNr">125 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L126"></a><span id="L126" class="LineNr">126 </span>    assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
-<a name="L127"></a><span id="L127" class="LineNr">127 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L128"></a><span id="L128" class="LineNr">128 </span>      assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == Container_metadata_snapshot<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
-<a name="L129"></a><span id="L129" class="LineNr">129 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
-<a name="L130"></a><span id="L130" class="LineNr">130 </span>    <span class="Delimiter">}</span>
-<a name="L131"></a><span id="L131" class="LineNr">131 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
-<a name="L132"></a><span id="L132" class="LineNr">132 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<a name="L133"></a><span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
-<a name="L134"></a><span id="L134" class="LineNr">134 </span>  Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span>
-<a name="L135"></a><span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
-<a name="L136"></a><span id="L136" class="LineNr">136 </span><span class="Normal">void</span> clear_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L137"></a><span id="L137" class="LineNr">137 </span>  Container_metadata_snapshot<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<a name="L138"></a><span id="L138" class="LineNr">138 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L139"></a><span id="L139" class="LineNr">139 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
-<a name="L140"></a><span id="L140" class="LineNr">140 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
-<a name="L141"></a><span id="L141" class="LineNr">141 </span>  <span class="Delimiter">}</span>
-<a name="L142"></a><span id="L142" class="LineNr">142 </span>  Container_metadata<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
-<a name="L143"></a><span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span>
-<a name="L144"></a><span id="L144" class="LineNr">144 </span>
-<a name="L145"></a><span id="L145" class="LineNr">145 </span><span class="Comment">//: do no work in size_of, simply lookup Container_metadata</span>
-<a name="L146"></a><span id="L146" class="LineNr">146 </span>
-<a name="L147"></a><span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
-<a name="L148"></a><span id="L148" class="LineNr">148 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
-<a name="L149"></a><span id="L149" class="LineNr">149 </span>
-<a name="L150"></a><span id="L150" class="LineNr">150 </span><span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
-<a name="L151"></a><span id="L151" class="LineNr">151 </span><span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-<a name="L152"></a><span id="L152" class="LineNr">152 </span><span class="Comment">// Update base_type in size_of(type)</span>
-<a name="L153"></a><span id="L153" class="LineNr">153 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L154"></a><span id="L154" class="LineNr">154 </span>  raise &lt;&lt; <span class="Constant">&quot;no such type &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L155"></a><span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<a name="L156"></a><span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
-<a name="L157"></a><span id="L157" class="LineNr">157 </span>type_info t = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<a name="L158"></a><span id="L158" class="LineNr">158 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L159"></a><span id="L159" class="LineNr">159 </span>  <span class="Comment">// Compute size_of Container</span>
-<a name="L160"></a><span id="L160" class="LineNr">160 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L161"></a><span id="L161" class="LineNr">161 </span>    raise &lt;&lt; <span class="Constant">&quot;unknown size for container type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L162"></a><span id="L162" class="LineNr">162 </span><span class="CommentedCode">//?     DUMP(&quot;&quot;);</span>
-<a name="L163"></a><span id="L163" class="LineNr">163 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
-<a name="L164"></a><span id="L164" class="LineNr">164 </span>  <span class="Delimiter">}</span>
-<a name="L165"></a><span id="L165" class="LineNr">165 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
-<a name="L166"></a><span id="L166" class="LineNr">166 </span><span class="Delimiter">}</span>
-<a name="L167"></a><span id="L167" class="LineNr">167 </span>
-<a name="L168"></a><span id="L168" class="LineNr">168 </span><span class="Comment">//: precompute Container_metadata before we need size_of</span>
-<a name="L169"></a><span id="L169" class="LineNr">169 </span><span class="Comment">//: also store a copy in each reagent in each instruction in each recipe</span>
-<a name="L170"></a><span id="L170" class="LineNr">170 </span>
-<a name="L171"></a><span id="L171" class="LineNr">171 </span><span class="Delimiter">:(after &quot;End Type Modifying Transforms&quot;)</span>
-<a name="L172"></a><span id="L172" class="LineNr">172 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_sizes<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<a name="L173"></a><span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span>
-<a name="L174"></a><span id="L174" class="LineNr">174 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L175"></a><span id="L175" class="LineNr">175 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-<a name="L176"></a><span id="L176" class="LineNr">176 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute container sizes for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L177"></a><span id="L177" class="LineNr">177 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L178"></a><span id="L178" class="LineNr">178 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-<a name="L179"></a><span id="L179" class="LineNr">179 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L180"></a><span id="L180" class="LineNr">180 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L181"></a><span id="L181" class="LineNr">181 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-<a name="L182"></a><span id="L182" class="LineNr">182 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L183"></a><span id="L183" class="LineNr">183 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-<a name="L184"></a><span id="L184" class="LineNr">184 </span>  <span class="Delimiter">}</span>
-<a name="L185"></a><span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
-<a name="L186"></a><span id="L186" class="LineNr">186 </span>
-<a name="L187"></a><span id="L187" class="LineNr">187 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L188"></a><span id="L188" class="LineNr">188 </span>  expand_type_abbreviations<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<a name="L189"></a><span id="L189" class="LineNr">189 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L190"></a><span id="L190" class="LineNr">190 </span>  reagent rcopy = r<span class="Delimiter">;</span>
-<a name="L191"></a><span id="L191" class="LineNr">191 </span>  <span class="Comment">// Compute Container Size(reagent rcopy)</span>
-<a name="L192"></a><span id="L192" class="LineNr">192 </span>  set&lt;type_tree&gt; pending_metadata<span class="Delimiter">;</span>  <span class="Comment">// might actually be faster to just convert to string rather than compare type_tree directly; so far the difference is negligible</span>
-<a name="L193"></a><span id="L193" class="LineNr">193 </span>  compute_container_sizes<span class="Delimiter">(</span>rcopy<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<a name="L194"></a><span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
-<a name="L195"></a><span id="L195" class="LineNr">195 </span>    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<a name="L196"></a><span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
-<a name="L197"></a><span id="L197" class="LineNr">197 </span>
-<a name="L198"></a><span id="L198" class="LineNr">198 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L199"></a><span id="L199" class="LineNr">199 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L200"></a><span id="L200" class="LineNr">200 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L201"></a><span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L202"></a><span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>pending_metadata<span class="Delimiter">,</span> *type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L203"></a><span id="L203" class="LineNr">203 </span>  pending_metadata<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>*type<span class="Delimiter">);</span>
-<a name="L204"></a><span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L205"></a><span id="L205" class="LineNr">205 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L206"></a><span id="L206" class="LineNr">206 </span>      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L207"></a><span id="L207" class="LineNr">207 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L208"></a><span id="L208" class="LineNr">208 </span>    <span class="Delimiter">}</span>
-<a name="L209"></a><span id="L209" class="LineNr">209 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
-<a name="L210"></a><span id="L210" class="LineNr">210 </span>      compute_container_sizes<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<a name="L211"></a><span id="L211" class="LineNr">211 </span>    <span class="Comment">// End compute_container_sizes Non-atom Special-cases</span>
-<a name="L212"></a><span id="L212" class="LineNr">212 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L213"></a><span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
-<a name="L214"></a><span id="L214" class="LineNr">214 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-<a name="L215"></a><span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
-<a name="L216"></a><span id="L216" class="LineNr">216 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<a name="L217"></a><span id="L217" class="LineNr">217 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span>
-<a name="L218"></a><span id="L218" class="LineNr">218 </span>    compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<a name="L219"></a><span id="L219" class="LineNr">219 </span>  <span class="Comment">// End compute_container_sizes Atom Special-cases</span>
-<a name="L220"></a><span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
-<a name="L221"></a><span id="L221" class="LineNr">221 </span>
-<a name="L222"></a><span id="L222" class="LineNr">222 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L223"></a><span id="L223" class="LineNr">223 </span>  assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
-<a name="L224"></a><span id="L224" class="LineNr">224 </span>  <span class="Comment">// size of a container is the sum of the sizes of its element</span>
-<a name="L225"></a><span id="L225" class="LineNr">225 </span>  <span class="Comment">// (So it can only contain arrays if they're static and include their</span>
-<a name="L226"></a><span id="L226" class="LineNr">226 </span>  <span class="Comment">// length in the type.)</span>
-<a name="L227"></a><span id="L227" class="LineNr">227 </span>  container_metadata metadata<span class="Delimiter">;</span>
-<a name="L228"></a><span id="L228" class="LineNr">228 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L229"></a><span id="L229" class="LineNr">229 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
-<a name="L230"></a><span id="L230" class="LineNr">230 </span>    <span class="Comment">// Compute Container Size(element, full_type)</span>
-<a name="L231"></a><span id="L231" class="LineNr">231 </span>    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
-<a name="L232"></a><span id="L232" class="LineNr">232 </span>    metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>  <span class="Comment">// save previous size as offset</span>
-<a name="L233"></a><span id="L233" class="LineNr">233 </span>    metadata<span class="Delimiter">.</span>size += size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
-<a name="L234"></a><span id="L234" class="LineNr">234 </span>  <span class="Delimiter">}</span>
-<a name="L235"></a><span id="L235" class="LineNr">235 </span>  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
-<a name="L236"></a><span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
-<a name="L237"></a><span id="L237" class="LineNr">237 </span>
-<a name="L238"></a><span id="L238" class="LineNr">238 </span><span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L239"></a><span id="L239" class="LineNr">239 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-<a name="L240"></a><span id="L240" class="LineNr">240 </span>  <span class="Normal">const</span> type_tree* result = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
-<a name="L241"></a><span id="L241" class="LineNr">241 </span>  assert<span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
-<a name="L242"></a><span id="L242" class="LineNr">242 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
-<a name="L243"></a><span id="L243" class="LineNr">243 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
-<a name="L244"></a><span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span>
-<a name="L245"></a><span id="L245" class="LineNr">245 </span>
-<a name="L246"></a><span id="L246" class="LineNr">246 </span>container_metadata&amp; get<span class="Delimiter">(</span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L247"></a><span id="L247" class="LineNr">247 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L248"></a><span id="L248" class="LineNr">248 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
-<a name="L249"></a><span id="L249" class="LineNr">249 </span>      <span class="Identifier">return</span> all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
-<a name="L250"></a><span id="L250" class="LineNr">250 </span>  <span class="Delimiter">}</span>
-<a name="L251"></a><span id="L251" class="LineNr">251 </span>  tb_shutdown<span class="Delimiter">();</span>
-<a name="L252"></a><span id="L252" class="LineNr">252 </span>  raise &lt;&lt; <span class="Constant">&quot;unknown size for type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L253"></a><span id="L253" class="LineNr">253 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
-<a name="L254"></a><span id="L254" class="LineNr">254 </span><span class="Delimiter">}</span>
-<a name="L255"></a><span id="L255" class="LineNr">255 </span>
-<a name="L256"></a><span id="L256" class="LineNr">256 </span><span class="Normal">bool</span> contains_key<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L257"></a><span id="L257" class="LineNr">257 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L258"></a><span id="L258" class="LineNr">258 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
-<a name="L259"></a><span id="L259" class="LineNr">259 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<a name="L260"></a><span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
-<a name="L261"></a><span id="L261" class="LineNr">261 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<a name="L262"></a><span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
-<a name="L263"></a><span id="L263" class="LineNr">263 </span>
-<a name="L264"></a><span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> matches<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L265"></a><span id="L265" class="LineNr">265 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a == b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
-<a name="L266"></a><span id="L266" class="LineNr">266 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!a || !b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<a name="L267"></a><span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
-<a name="L268"></a><span id="L268" class="LineNr">268 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>value == b<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
-<a name="L269"></a><span id="L269" class="LineNr">269 </span>  <span class="Identifier">return</span> matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
-<a name="L270"></a><span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
-<a name="L271"></a><span id="L271" class="LineNr">271 </span>
-<a name="L272"></a><span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenario stash_container)</span>
-<a name="L273"></a><span id="L273" class="LineNr">273 </span><span class="muRecipe">def</span> main [
-<a name="L274"></a><span id="L274" class="LineNr">274 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
-<a name="L275"></a><span id="L275" class="LineNr">275 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L276"></a><span id="L276" class="LineNr">276 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L277"></a><span id="L277" class="LineNr">277 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:point-number/<span class="Special">raw</span>
-<a name="L278"></a><span id="L278" class="LineNr">278 </span>]
-<a name="L279"></a><span id="L279" class="LineNr">279 </span><span class="traceContains">+app: foo: 34 35 36</span>
-<a name="L280"></a><span id="L280" class="LineNr">280 </span>
-<a name="L281"></a><span id="L281" class="LineNr">281 </span><span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
-<a name="L282"></a><span id="L282" class="LineNr">282 </span>
-<a name="L283"></a><span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
-<a name="L284"></a><span id="L284" class="LineNr">284 </span><span class="Normal">void</span> test_container_sizes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L285"></a><span id="L285" class="LineNr">285 </span>  <span class="Comment">// a container we don't have the size for</span>
-<a name="L286"></a><span id="L286" class="LineNr">286 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-<a name="L287"></a><span id="L287" class="LineNr">287 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L288"></a><span id="L288" class="LineNr">288 </span>  <span class="Comment">// scan</span>
-<a name="L289"></a><span id="L289" class="LineNr">289 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<a name="L290"></a><span id="L290" class="LineNr">290 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
-<a name="L291"></a><span id="L291" class="LineNr">291 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L292"></a><span id="L292" class="LineNr">292 </span>  <span class="Comment">// the global table also knows its size</span>
-<a name="L293"></a><span id="L293" class="LineNr">293 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L294"></a><span id="L294" class="LineNr">294 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L295"></a><span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
-<a name="L296"></a><span id="L296" class="LineNr">296 </span>
-<a name="L297"></a><span id="L297" class="LineNr">297 </span><span class="Normal">void</span> test_container_sizes_through_aliases<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L298"></a><span id="L298" class="LineNr">298 </span>  <span class="Comment">// a new alias for a container</span>
-<a name="L299"></a><span id="L299" class="LineNr">299 </span>  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;pt&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;point&quot;</span><span class="Delimiter">));</span>
-<a name="L300"></a><span id="L300" class="LineNr">300 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:pt&quot;</span><span class="Delimiter">);</span>
-<a name="L301"></a><span id="L301" class="LineNr">301 </span>  <span class="Comment">// scan</span>
-<a name="L302"></a><span id="L302" class="LineNr">302 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<a name="L303"></a><span id="L303" class="LineNr">303 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
-<a name="L304"></a><span id="L304" class="LineNr">304 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L305"></a><span id="L305" class="LineNr">305 </span>  <span class="Comment">// the global table also knows its size</span>
-<a name="L306"></a><span id="L306" class="LineNr">306 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L307"></a><span id="L307" class="LineNr">307 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L308"></a><span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span>
-<a name="L309"></a><span id="L309" class="LineNr">309 </span>
-<a name="L310"></a><span id="L310" class="LineNr">310 </span><span class="Normal">void</span> test_container_sizes_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L311"></a><span id="L311" class="LineNr">311 </span>  <span class="Comment">// a container we don't have the size for</span>
-<a name="L312"></a><span id="L312" class="LineNr">312 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point-number&quot;</span><span class="Delimiter">);</span>
-<a name="L313"></a><span id="L313" class="LineNr">313 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L314"></a><span id="L314" class="LineNr">314 </span>  <span class="Comment">// scan</span>
-<a name="L315"></a><span id="L315" class="LineNr">315 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<a name="L316"></a><span id="L316" class="LineNr">316 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
-<a name="L317"></a><span id="L317" class="LineNr">317 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<a name="L318"></a><span id="L318" class="LineNr">318 </span>  <span class="Comment">// the global table also knows its size</span>
-<a name="L319"></a><span id="L319" class="LineNr">319 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L320"></a><span id="L320" class="LineNr">320 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
-<a name="L321"></a><span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
-<a name="L322"></a><span id="L322" class="LineNr">322 </span>
-<a name="L323"></a><span id="L323" class="LineNr">323 </span><span class="Normal">void</span> test_container_sizes_recursive<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L324"></a><span id="L324" class="LineNr">324 </span>  <span class="Comment">// define a container containing an address to itself</span>
-<a name="L325"></a><span id="L325" class="LineNr">325 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L326"></a><span id="L326" class="LineNr">326 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L327"></a><span id="L327" class="LineNr">327 </span>      <span class="Constant">&quot;  y:address:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L328"></a><span id="L328" class="LineNr">328 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-<a name="L329"></a><span id="L329" class="LineNr">329 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
-<a name="L330"></a><span id="L330" class="LineNr">330 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<a name="L331"></a><span id="L331" class="LineNr">331 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L332"></a><span id="L332" class="LineNr">332 </span><span class="Delimiter">}</span>
-<a name="L333"></a><span id="L333" class="LineNr">333 </span>
-<a name="L334"></a><span id="L334" class="LineNr">334 </span><span class="Normal">void</span> test_container_sizes_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L335"></a><span id="L335" class="LineNr">335 </span>  <span class="Comment">// a container we don't have the size for</span>
-<a name="L336"></a><span id="L336" class="LineNr">336 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
-<a name="L337"></a><span id="L337" class="LineNr">337 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L338"></a><span id="L338" class="LineNr">338 </span>  <span class="Comment">// scanning an address to the container precomputes the size of the container</span>
-<a name="L339"></a><span id="L339" class="LineNr">339 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:point&quot;</span><span class="Delimiter">);</span>
-<a name="L340"></a><span id="L340" class="LineNr">340 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
-<a name="L341"></a><span id="L341" class="LineNr">341 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
-<a name="L342"></a><span id="L342" class="LineNr">342 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L343"></a><span id="L343" class="LineNr">343 </span><span class="Delimiter">}</span>
-<a name="L344"></a><span id="L344" class="LineNr">344 </span>
-<a name="L345"></a><span id="L345" class="LineNr">345 </span><span class="SalientComment">//:: To access elements of a container, use 'get'</span>
-<a name="L346"></a><span id="L346" class="LineNr">346 </span><span class="Comment">//: 'get' takes a 'base' container and an 'offset' into it and returns the</span>
-<a name="L347"></a><span id="L347" class="LineNr">347 </span><span class="Comment">//: appropriate element of the container value.</span>
-<a name="L348"></a><span id="L348" class="LineNr">348 </span>
-<a name="L349"></a><span id="L349" class="LineNr">349 </span><span class="Delimiter">:(scenario get)</span>
-<a name="L350"></a><span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> main [
-<a name="L351"></a><span id="L351" class="LineNr">351 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L352"></a><span id="L352" class="LineNr">352 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L353"></a><span id="L353" class="LineNr">353 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
-<a name="L354"></a><span id="L354" class="LineNr">354 </span>]
-<a name="L355"></a><span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 35 in location 15</span>
-<a name="L356"></a><span id="L356" class="LineNr">356 </span>
-<a name="L357"></a><span id="L357" class="LineNr">357 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-<a name="L358"></a><span id="L358" class="LineNr">358 </span>GET<span class="Delimiter">,</span>
-<a name="L359"></a><span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-<a name="L360"></a><span id="L360" class="LineNr">360 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get&quot;</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span>
-<a name="L361"></a><span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<a name="L362"></a><span id="L362" class="LineNr">362 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
-<a name="L363"></a><span id="L363" class="LineNr">363 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L364"></a><span id="L364" class="LineNr">364 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L365"></a><span id="L365" class="LineNr">365 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L366"></a><span id="L366" class="LineNr">366 </span>  <span class="Delimiter">}</span>
-<a name="L367"></a><span id="L367" class="LineNr">367 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// new copy for every invocation</span>
-<a name="L368"></a><span id="L368" class="LineNr">368 </span>  <span class="Comment">// Update GET base in Check</span>
-<a name="L369"></a><span id="L369" class="LineNr">369 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L370"></a><span id="L370" class="LineNr">370 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L371"></a><span id="L371" class="LineNr">371 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L372"></a><span id="L372" class="LineNr">372 </span>  <span class="Delimiter">}</span>
-<a name="L373"></a><span id="L373" class="LineNr">373 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-<a name="L374"></a><span id="L374" class="LineNr">374 </span>  <span class="Comment">// Update GET base_type in Check</span>
-<a name="L375"></a><span id="L375" class="LineNr">375 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L376"></a><span id="L376" class="LineNr">376 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L377"></a><span id="L377" class="LineNr">377 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L378"></a><span id="L378" class="LineNr">378 </span>  <span class="Delimiter">}</span>
-<a name="L379"></a><span id="L379" class="LineNr">379 </span>  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-<a name="L380"></a><span id="L380" class="LineNr">380 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L381"></a><span id="L381" class="LineNr">381 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L382"></a><span id="L382" class="LineNr">382 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L383"></a><span id="L383" class="LineNr">383 </span>  <span class="Delimiter">}</span>
-<a name="L384"></a><span id="L384" class="LineNr">384 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
-<a name="L385"></a><span id="L385" class="LineNr">385 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
-<a name="L386"></a><span id="L386" class="LineNr">386 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
-<a name="L387"></a><span id="L387" class="LineNr">387 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<a name="L388"></a><span id="L388" class="LineNr">388 </span>  <span class="Normal">else</span>
-<a name="L389"></a><span id="L389" class="LineNr">389 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-<a name="L390"></a><span id="L390" class="LineNr">390 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L391"></a><span id="L391" class="LineNr">391 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L392"></a><span id="L392" class="LineNr">392 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L393"></a><span id="L393" class="LineNr">393 </span>  <span class="Delimiter">}</span>
-<a name="L394"></a><span id="L394" class="LineNr">394 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L395"></a><span id="L395" class="LineNr">395 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L396"></a><span id="L396" class="LineNr">396 </span>  <span class="Comment">// Update GET product in Check</span>
-<a name="L397"></a><span id="L397" class="LineNr">397 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-<a name="L398"></a><span id="L398" class="LineNr">398 </span>  <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
-<a name="L399"></a><span id="L399" class="LineNr">399 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L400"></a><span id="L400" class="LineNr">400 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L401"></a><span id="L401" class="LineNr">401 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L402"></a><span id="L402" class="LineNr">402 </span>  <span class="Delimiter">}</span>
-<a name="L403"></a><span id="L403" class="LineNr">403 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L404"></a><span id="L404" class="LineNr">404 </span><span class="Delimiter">}</span>
-<a name="L405"></a><span id="L405" class="LineNr">405 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<a name="L406"></a><span id="L406" class="LineNr">406 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
-<a name="L407"></a><span id="L407" class="LineNr">407 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L408"></a><span id="L408" class="LineNr">408 </span>  <span class="Comment">// Update GET base in Run</span>
-<a name="L409"></a><span id="L409" class="LineNr">409 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-<a name="L410"></a><span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L411"></a><span id="L411" class="LineNr">411 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L412"></a><span id="L412" class="LineNr">412 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L413"></a><span id="L413" class="LineNr">413 </span>  <span class="Delimiter">}</span>
-<a name="L414"></a><span id="L414" class="LineNr">414 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-<a name="L415"></a><span id="L415" class="LineNr">415 </span>  <span class="Comment">// Update GET base_type in Run</span>
-<a name="L416"></a><span id="L416" class="LineNr">416 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L417"></a><span id="L417" class="LineNr">417 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
-<a name="L418"></a><span id="L418" class="LineNr">418 </span>  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
-<a name="L419"></a><span id="L419" class="LineNr">419 </span>  <span class="Normal">int</span> src = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
-<a name="L420"></a><span id="L420" class="LineNr">420 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L421"></a><span id="L421" class="LineNr">421 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-<a name="L422"></a><span id="L422" class="LineNr">422 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
-<a name="L423"></a><span id="L423" class="LineNr">423 </span>  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span>
-<a name="L424"></a><span id="L424" class="LineNr">424 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L425"></a><span id="L425" class="LineNr">425 </span>  <span class="Comment">// Read element</span>
-<a name="L426"></a><span id="L426" class="LineNr">426 </span>  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
-<a name="L427"></a><span id="L427" class="LineNr">427 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L428"></a><span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span>
-<a name="L429"></a><span id="L429" class="LineNr">429 </span>
-<a name="L430"></a><span id="L430" class="LineNr">430 </span><span class="Delimiter">:(code)</span>
-<a name="L431"></a><span id="L431" class="LineNr">431 </span><span class="Normal">const</span> reagent element_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L432"></a><span id="L432" class="LineNr">432 </span>  assert<span class="Delimiter">(</span>offset_value &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L433"></a><span id="L433" class="LineNr">433 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
-<a name="L434"></a><span id="L434" class="LineNr">434 </span>  <span class="Comment">// Update base_type in element_type</span>
-<a name="L435"></a><span id="L435" class="LineNr">435 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
-<a name="L436"></a><span id="L436" class="LineNr">436 </span>  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<a name="L437"></a><span id="L437" class="LineNr">437 </span>  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
-<a name="L438"></a><span id="L438" class="LineNr">438 </span>  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
-<a name="L439"></a><span id="L439" class="LineNr">439 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &gt;= SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span>  <span class="Comment">// error handled elsewhere</span>
-<a name="L440"></a><span id="L440" class="LineNr">440 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset_value<span class="Delimiter">);</span>
-<a name="L441"></a><span id="L441" class="LineNr">441 </span>  <span class="Comment">// End element_type Special-cases</span>
-<a name="L442"></a><span id="L442" class="LineNr">442 </span>  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
-<a name="L443"></a><span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span>
-<a name="L444"></a><span id="L444" class="LineNr">444 </span>
-<a name="L445"></a><span id="L445" class="LineNr">445 </span><span class="Delimiter">:(scenario get_handles_nested_container_elements)</span>
-<a name="L446"></a><span id="L446" class="LineNr">446 </span><span class="muRecipe">def</span> main [
-<a name="L447"></a><span id="L447" class="LineNr">447 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L448"></a><span id="L448" class="LineNr">448 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L449"></a><span id="L449" class="LineNr">449 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L450"></a><span id="L450" class="LineNr">450 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
-<a name="L451"></a><span id="L451" class="LineNr">451 </span>]
-<a name="L452"></a><span id="L452" class="LineNr">452 </span><span class="traceContains">+mem: storing 36 in location 15</span>
-<a name="L453"></a><span id="L453" class="LineNr">453 </span>
-<a name="L454"></a><span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario get_out_of_bounds)</span>
-<a name="L455"></a><span id="L455" class="LineNr">455 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L456"></a><span id="L456" class="LineNr">456 </span><span class="muRecipe">def</span> main [
-<a name="L457"></a><span id="L457" class="LineNr">457 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L458"></a><span id="L458" class="LineNr">458 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L459"></a><span id="L459" class="LineNr">459 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L460"></a><span id="L460" class="LineNr">460 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2:offset</span>  <span class="Comment"># point-number occupies 3 locations but has only 2 fields; out of bounds</span>
-<a name="L461"></a><span id="L461" class="LineNr">461 </span>]
-<a name="L462"></a><span id="L462" class="LineNr">462 </span><span class="traceContains">+error: main: invalid offset '2' for 'point-number'</span>
-<a name="L463"></a><span id="L463" class="LineNr">463 </span>
-<a name="L464"></a><span id="L464" class="LineNr">464 </span><span class="Delimiter">:(scenario get_out_of_bounds_2)</span>
-<a name="L465"></a><span id="L465" class="LineNr">465 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L466"></a><span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> main [
-<a name="L467"></a><span id="L467" class="LineNr">467 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L468"></a><span id="L468" class="LineNr">468 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L469"></a><span id="L469" class="LineNr">469 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L470"></a><span id="L470" class="LineNr">470 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span>
-<a name="L471"></a><span id="L471" class="LineNr">471 </span>]
-<a name="L472"></a><span id="L472" class="LineNr">472 </span><span class="traceContains">+error: main: invalid offset '-1' for 'point-number'</span>
-<a name="L473"></a><span id="L473" class="LineNr">473 </span>
-<a name="L474"></a><span id="L474" class="LineNr">474 </span><span class="Delimiter">:(scenario get_product_type_mismatch)</span>
-<a name="L475"></a><span id="L475" class="LineNr">475 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L476"></a><span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> main [
-<a name="L477"></a><span id="L477" class="LineNr">477 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L478"></a><span id="L478" class="LineNr">478 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L479"></a><span id="L479" class="LineNr">479 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
-<a name="L480"></a><span id="L480" class="LineNr">480 </span>  <span class="Constant">15</span>:address:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-<a name="L481"></a><span id="L481" class="LineNr">481 </span>]
-<a name="L482"></a><span id="L482" class="LineNr">482 </span><span class="traceContains">+error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span>
-<a name="L483"></a><span id="L483" class="LineNr">483 </span>
-<a name="L484"></a><span id="L484" class="LineNr">484 </span><span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span>
-<a name="L485"></a><span id="L485" class="LineNr">485 </span>
-<a name="L486"></a><span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario get_without_product)</span>
-<a name="L487"></a><span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [
-<a name="L488"></a><span id="L488" class="LineNr">488 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L489"></a><span id="L489" class="LineNr">489 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L490"></a><span id="L490" class="LineNr">490 </span>  get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
-<a name="L491"></a><span id="L491" class="LineNr">491 </span>]
-<a name="L492"></a><span id="L492" class="LineNr">492 </span><span class="Comment"># just don't die</span>
-<a name="L493"></a><span id="L493" class="LineNr">493 </span>
-<a name="L494"></a><span id="L494" class="LineNr">494 </span><span class="SalientComment">//:: To write to elements of containers, use 'put'.</span>
-<a name="L495"></a><span id="L495" class="LineNr">495 </span>
-<a name="L496"></a><span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario put)</span>
-<a name="L497"></a><span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [
-<a name="L498"></a><span id="L498" class="LineNr">498 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L499"></a><span id="L499" class="LineNr">499 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L500"></a><span id="L500" class="LineNr">500 </span>  $clear-trace
-<a name="L501"></a><span id="L501" class="LineNr">501 </span>  <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-<a name="L502"></a><span id="L502" class="LineNr">502 </span>]
-<a name="L503"></a><span id="L503" class="LineNr">503 </span><span class="traceContains">+mem: storing 36 in location 13</span>
-<a name="L504"></a><span id="L504" class="LineNr">504 </span><span class="traceAbsent">-mem: storing 34 in location 12</span>
-<a name="L505"></a><span id="L505" class="LineNr">505 </span>
-<a name="L506"></a><span id="L506" class="LineNr">506 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
-<a name="L507"></a><span id="L507" class="LineNr">507 </span>PUT<span class="Delimiter">,</span>
-<a name="L508"></a><span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
-<a name="L509"></a><span id="L509" class="LineNr">509 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put&quot;</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span>
-<a name="L510"></a><span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
-<a name="L511"></a><span id="L511" class="LineNr">511 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
-<a name="L512"></a><span id="L512" class="LineNr">512 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L513"></a><span id="L513" class="LineNr">513 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L514"></a><span id="L514" class="LineNr">514 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L515"></a><span id="L515" class="LineNr">515 </span>  <span class="Delimiter">}</span>
-<a name="L516"></a><span id="L516" class="LineNr">516 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L517"></a><span id="L517" class="LineNr">517 </span>  <span class="Comment">// Update PUT base in Check</span>
-<a name="L518"></a><span id="L518" class="LineNr">518 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L519"></a><span id="L519" class="LineNr">519 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L520"></a><span id="L520" class="LineNr">520 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L521"></a><span id="L521" class="LineNr">521 </span>  <span class="Delimiter">}</span>
-<a name="L522"></a><span id="L522" class="LineNr">522 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-<a name="L523"></a><span id="L523" class="LineNr">523 </span>  <span class="Comment">// Update PUT base_type in Check</span>
-<a name="L524"></a><span id="L524" class="LineNr">524 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L525"></a><span id="L525" class="LineNr">525 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L526"></a><span id="L526" class="LineNr">526 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L527"></a><span id="L527" class="LineNr">527 </span>  <span class="Delimiter">}</span>
-<a name="L528"></a><span id="L528" class="LineNr">528 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
-<a name="L529"></a><span id="L529" class="LineNr">529 </span>  <span class="Comment">// Update PUT offset in Check</span>
-<a name="L530"></a><span id="L530" class="LineNr">530 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L531"></a><span id="L531" class="LineNr">531 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L532"></a><span id="L532" class="LineNr">532 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L533"></a><span id="L533" class="LineNr">533 </span>  <span class="Delimiter">}</span>
-<a name="L534"></a><span id="L534" class="LineNr">534 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
-<a name="L535"></a><span id="L535" class="LineNr">535 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
-<a name="L536"></a><span id="L536" class="LineNr">536 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L537"></a><span id="L537" class="LineNr">537 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
-<a name="L538"></a><span id="L538" class="LineNr">538 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L539"></a><span id="L539" class="LineNr">539 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L540"></a><span id="L540" class="LineNr">540 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L541"></a><span id="L541" class="LineNr">541 </span>    <span class="Delimiter">}</span>
-<a name="L542"></a><span id="L542" class="LineNr">542 </span>  <span class="Delimiter">}</span>
-<a name="L543"></a><span id="L543" class="LineNr">543 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
-<a name="L544"></a><span id="L544" class="LineNr">544 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-<a name="L545"></a><span id="L545" class="LineNr">545 </span>  <span class="Delimiter">}</span>
-<a name="L546"></a><span id="L546" class="LineNr">546 </span>  <span class="Normal">const</span> reagent&amp; value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
-<a name="L547"></a><span id="L547" class="LineNr">547 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
-<a name="L548"></a><span id="L548" class="LineNr">548 </span>  <span class="Normal">const</span> reagent&amp; element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
-<a name="L549"></a><span id="L549" class="LineNr">549 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L550"></a><span id="L550" class="LineNr">550 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L551"></a><span id="L551" class="LineNr">551 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L552"></a><span id="L552" class="LineNr">552 </span>  <span class="Delimiter">}</span>
-<a name="L553"></a><span id="L553" class="LineNr">553 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// no more checks necessary</span>
-<a name="L554"></a><span id="L554" class="LineNr">554 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L555"></a><span id="L555" class="LineNr">555 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L556"></a><span id="L556" class="LineNr">556 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L557"></a><span id="L557" class="LineNr">557 </span>  <span class="Delimiter">}</span>
-<a name="L558"></a><span id="L558" class="LineNr">558 </span>  <span class="Comment">// End PUT Product Checks</span>
-<a name="L559"></a><span id="L559" class="LineNr">559 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L560"></a><span id="L560" class="LineNr">560 </span><span class="Delimiter">}</span>
-<a name="L561"></a><span id="L561" class="LineNr">561 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
-<a name="L562"></a><span id="L562" class="LineNr">562 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
-<a name="L563"></a><span id="L563" class="LineNr">563 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L564"></a><span id="L564" class="LineNr">564 </span>  <span class="Comment">// Update PUT base in Run</span>
-<a name="L565"></a><span id="L565" class="LineNr">565 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
-<a name="L566"></a><span id="L566" class="LineNr">566 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L567"></a><span id="L567" class="LineNr">567 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L568"></a><span id="L568" class="LineNr">568 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L569"></a><span id="L569" class="LineNr">569 </span>  <span class="Delimiter">}</span>
-<a name="L570"></a><span id="L570" class="LineNr">570 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
-<a name="L571"></a><span id="L571" class="LineNr">571 </span>  <span class="Comment">// Update PUT base_type in Run</span>
-<a name="L572"></a><span id="L572" class="LineNr">572 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
-<a name="L573"></a><span id="L573" class="LineNr">573 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
-<a name="L574"></a><span id="L574" class="LineNr">574 </span>  <span class="Normal">int</span> address = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
-<a name="L575"></a><span id="L575" class="LineNr">575 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L576"></a><span id="L576" class="LineNr">576 </span>  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
-<a name="L577"></a><span id="L577" class="LineNr">577 </span>  <span class="Comment">// and writing the entire container</span>
-<a name="L578"></a><span id="L578" class="LineNr">578 </span>  <span class="Comment">// Write Memory in PUT in Run</span>
-<a name="L579"></a><span id="L579" class="LineNr">579 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L580"></a><span id="L580" class="LineNr">580 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L581"></a><span id="L581" class="LineNr">581 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
-<a name="L582"></a><span id="L582" class="LineNr">582 </span>  <span class="Delimiter">}</span>
-<a name="L583"></a><span id="L583" class="LineNr">583 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
-<a name="L584"></a><span id="L584" class="LineNr">584 </span><span class="Delimiter">}</span>
-<a name="L585"></a><span id="L585" class="LineNr">585 </span>
-<a name="L586"></a><span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario put_product_error)</span>
-<a name="L587"></a><span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L588"></a><span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main [
-<a name="L589"></a><span id="L589" class="LineNr">589 </span>  local-scope
-<a name="L590"></a><span id="L590" class="LineNr">590 </span>  load-ingredients
-<a name="L591"></a><span id="L591" class="LineNr">591 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
-<a name="L592"></a><span id="L592" class="LineNr">592 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
-<a name="L593"></a><span id="L593" class="LineNr">593 </span>]
-<a name="L594"></a><span id="L594" class="LineNr">594 </span><span class="traceContains">+error: main: product of 'put' must be first ingredient '1:point', but got '3:point'</span>
-<a name="L595"></a><span id="L595" class="LineNr">595 </span>
-<a name="L596"></a><span id="L596" class="LineNr">596 </span><span class="SalientComment">//:: Allow containers to be defined in Mu code.</span>
-<a name="L597"></a><span id="L597" class="LineNr">597 </span>
-<a name="L598"></a><span id="L598" class="LineNr">598 </span><span class="Delimiter">:(scenarios load)</span>
-<a name="L599"></a><span id="L599" class="LineNr">599 </span><span class="Delimiter">:(scenario container)</span>
-<a name="L600"></a><span id="L600" class="LineNr">600 </span><span class="muData">container</span> foo [
-<a name="L601"></a><span id="L601" class="LineNr">601 </span>  <span class="Normal">x</span>:num
-<a name="L602"></a><span id="L602" class="LineNr">602 </span>  <span class="Normal">y</span>:num
-<a name="L603"></a><span id="L603" class="LineNr">603 </span>]
-<a name="L604"></a><span id="L604" class="LineNr">604 </span><span class="traceContains">+parse: --- defining container foo</span>
-<a name="L605"></a><span id="L605" class="LineNr">605 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
-<a name="L606"></a><span id="L606" class="LineNr">606 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
-<a name="L607"></a><span id="L607" class="LineNr">607 </span>
-<a name="L608"></a><span id="L608" class="LineNr">608 </span><span class="Delimiter">:(scenario container_use_before_definition)</span>
-<a name="L609"></a><span id="L609" class="LineNr">609 </span><span class="muData">container</span> foo [
-<a name="L610"></a><span id="L610" class="LineNr">610 </span>  <span class="Normal">x</span>:num
-<a name="L611"></a><span id="L611" class="LineNr">611 </span>  <span class="Normal">y</span>:bar
-<a name="L612"></a><span id="L612" class="LineNr">612 </span>]
-<a name="L613"></a><span id="L613" class="LineNr">613 </span><span class="muData">container</span> bar [
-<a name="L614"></a><span id="L614" class="LineNr">614 </span>  <span class="Normal">x</span>:num
-<a name="L615"></a><span id="L615" class="LineNr">615 </span>  <span class="Normal">y</span>:num
-<a name="L616"></a><span id="L616" class="LineNr">616 </span>]
-<a name="L617"></a><span id="L617" class="LineNr">617 </span><span class="traceContains">+parse: --- defining container foo</span>
-<a name="L618"></a><span id="L618" class="LineNr">618 </span><span class="traceContains">+parse: type number: 1000</span>
-<a name="L619"></a><span id="L619" class="LineNr">619 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
-<a name="L620"></a><span id="L620" class="LineNr">620 </span><span class="Comment"># todo: brittle</span>
-<a name="L621"></a><span id="L621" class="LineNr">621 </span><span class="Comment"># type bar is unknown at this point, but we assign it a number</span>
-<a name="L622"></a><span id="L622" class="LineNr">622 </span><span class="traceContains">+parse:   element: {y: &quot;bar&quot;}</span>
-<a name="L623"></a><span id="L623" class="LineNr">623 </span><span class="Comment"># later type bar geon</span>
-<a name="L624"></a><span id="L624" class="LineNr">624 </span><span class="traceContains">+parse: --- defining container bar</span>
-<a name="L625"></a><span id="L625" class="LineNr">625 </span><span class="traceContains">+parse: type number: 1001</span>
-<a name="L626"></a><span id="L626" class="LineNr">626 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
-<a name="L627"></a><span id="L627" class="LineNr">627 </span><span class="traceContains">+parse:   element: {y: &quot;number&quot;}</span>
-<a name="L628"></a><span id="L628" class="LineNr">628 </span>
-<a name="L629"></a><span id="L629" class="LineNr">629 </span><span class="Comment">//: if a container is defined again, the new fields add to the original definition</span>
-<a name="L630"></a><span id="L630" class="LineNr">630 </span><span class="Delimiter">:(scenarios run)</span>
-<a name="L631"></a><span id="L631" class="LineNr">631 </span><span class="Delimiter">:(scenario container_extend)</span>
-<a name="L632"></a><span id="L632" class="LineNr">632 </span><span class="muData">container</span> foo [
-<a name="L633"></a><span id="L633" class="LineNr">633 </span>  <span class="Normal">x</span>:num
-<a name="L634"></a><span id="L634" class="LineNr">634 </span>]
-<a name="L635"></a><span id="L635" class="LineNr">635 </span><span class="Comment"># add to previous definition</span>
-<a name="L636"></a><span id="L636" class="LineNr">636 </span><span class="muData">container</span> foo [
-<a name="L637"></a><span id="L637" class="LineNr">637 </span>  <span class="Normal">y</span>:num
-<a name="L638"></a><span id="L638" class="LineNr">638 </span>]
-<a name="L639"></a><span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> main [
-<a name="L640"></a><span id="L640" class="LineNr">640 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L641"></a><span id="L641" class="LineNr">641 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
-<a name="L642"></a><span id="L642" class="LineNr">642 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-<a name="L643"></a><span id="L643" class="LineNr">643 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
-<a name="L644"></a><span id="L644" class="LineNr">644 </span>]
-<a name="L645"></a><span id="L645" class="LineNr">645 </span><span class="traceContains">+mem: storing 34 in location 3</span>
-<a name="L646"></a><span id="L646" class="LineNr">646 </span><span class="traceContains">+mem: storing 35 in location 4</span>
-<a name="L647"></a><span id="L647" class="LineNr">647 </span>
-<a name="L648"></a><span id="L648" class="LineNr">648 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
-<a name="L649"></a><span id="L649" class="LineNr">649 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L650"></a><span id="L650" class="LineNr">650 </span>  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
-<a name="L651"></a><span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span>
-<a name="L652"></a><span id="L652" class="LineNr">652 </span>
-<a name="L653"></a><span id="L653" class="LineNr">653 </span><span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span>
-<a name="L654"></a><span id="L654" class="LineNr">654 </span><span class="Comment">//: a call to transform_all. But we do want to detect this situation and raise</span>
-<a name="L655"></a><span id="L655" class="LineNr">655 </span><span class="Comment">//: an error. This field will help us raise such errors.</span>
-<a name="L656"></a><span id="L656" class="LineNr">656 </span><span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
-<a name="L657"></a><span id="L657" class="LineNr">657 </span><span class="Normal">int</span> Num_calls_to_transform_all_at_first_definition<span class="Delimiter">;</span>
-<a name="L658"></a><span id="L658" class="LineNr">658 </span><span class="Delimiter">:(before &quot;End type_info Constructor&quot;)</span>
-<a name="L659"></a><span id="L659" class="LineNr">659 </span>Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span>
-<a name="L660"></a><span id="L660" class="LineNr">660 </span>
-<a name="L661"></a><span id="L661" class="LineNr">661 </span><span class="Delimiter">:(code)</span>
-<a name="L662"></a><span id="L662" class="LineNr">662 </span><span class="Normal">void</span> insert_container<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; command<span class="Delimiter">,</span> kind_of_type kind<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L663"></a><span id="L663" class="LineNr">663 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L664"></a><span id="L664" class="LineNr">664 </span>  string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L665"></a><span id="L665" class="LineNr">665 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-<a name="L666"></a><span id="L666" class="LineNr">666 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-<a name="L667"></a><span id="L667" class="LineNr">667 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L668"></a><span id="L668" class="LineNr">668 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L669"></a><span id="L669" class="LineNr">669 </span>  <span class="Delimiter">}</span>
-<a name="L670"></a><span id="L670" class="LineNr">670 </span>  <span class="Comment">// End container Name Refinements</span>
-<a name="L671"></a><span id="L671" class="LineNr">671 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">' '</span> &lt;&lt; name &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L672"></a><span id="L672" class="LineNr">672 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span>
-<a name="L673"></a><span id="L673" class="LineNr">673 </span>      || get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L674"></a><span id="L674" class="LineNr">674 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-<a name="L675"></a><span id="L675" class="LineNr">675 </span>  <span class="Delimiter">}</span>
-<a name="L676"></a><span id="L676" class="LineNr">676 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L677"></a><span id="L677" class="LineNr">677 </span>  skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">&quot;'&quot;</span>+command+<span class="Constant">&quot;' must begin with '['&quot;</span><span class="Delimiter">);</span>
-<a name="L678"></a><span id="L678" class="LineNr">678 </span>  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
-<a name="L679"></a><span id="L679" class="LineNr">679 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L680"></a><span id="L680" class="LineNr">680 </span>    <span class="Comment">// initial definition of this container</span>
-<a name="L681"></a><span id="L681" class="LineNr">681 </span>    info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition = Num_calls_to_transform_all<span class="Delimiter">;</span>
-<a name="L682"></a><span id="L682" class="LineNr">682 </span>  <span class="Delimiter">}</span>
-<a name="L683"></a><span id="L683" class="LineNr">683 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition != Num_calls_to_transform_all<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L684"></a><span id="L684" class="LineNr">684 </span>    <span class="Comment">// extension after transform_all</span>
-<a name="L685"></a><span id="L685" class="LineNr">685 </span>    raise &lt;&lt; <span class="Constant">&quot;there was a call to transform_all() between the definition of container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' and a subsequent extension. This is not supported, since any recipes that used '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' values have already been transformed and </span><span class="cSpecial">\&quot;</span><span class="Constant">frozen</span><span class="cSpecial">\&quot;</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L686"></a><span id="L686" class="LineNr">686 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L687"></a><span id="L687" class="LineNr">687 </span>  <span class="Delimiter">}</span>
-<a name="L688"></a><span id="L688" class="LineNr">688 </span>  info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span>
-<a name="L689"></a><span id="L689" class="LineNr">689 </span>  info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span>
-<a name="L690"></a><span id="L690" class="LineNr">690 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L691"></a><span id="L691" class="LineNr">691 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L692"></a><span id="L692" class="LineNr">692 </span>    string element = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L693"></a><span id="L693" class="LineNr">693 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
-<a name="L694"></a><span id="L694" class="LineNr">694 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
-<a name="L695"></a><span id="L695" class="LineNr">695 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L696"></a><span id="L696" class="LineNr">696 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L697"></a><span id="L697" class="LineNr">697 </span>    <span class="Delimiter">}</span>
-<a name="L698"></a><span id="L698" class="LineNr">698 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L699"></a><span id="L699" class="LineNr">699 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L700"></a><span id="L700" class="LineNr">700 </span>      raise &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L701"></a><span id="L701" class="LineNr">701 </span>      <span class="Comment">// skip rest of container declaration</span>
-<a name="L702"></a><span id="L702" class="LineNr">702 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L703"></a><span id="L703" class="LineNr">703 </span>        skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L704"></a><span id="L704" class="LineNr">704 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L705"></a><span id="L705" class="LineNr">705 </span>      <span class="Delimiter">}</span>
-<a name="L706"></a><span id="L706" class="LineNr">706 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
-<a name="L707"></a><span id="L707" class="LineNr">707 </span>    <span class="Delimiter">}</span>
-<a name="L708"></a><span id="L708" class="LineNr">708 </span>    info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
-<a name="L709"></a><span id="L709" class="LineNr">709 </span>    expand_type_abbreviations<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">);</span>  <span class="Comment">// todo: use abbreviation before declaration</span>
-<a name="L710"></a><span id="L710" class="LineNr">710 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-<a name="L711"></a><span id="L711" class="LineNr">711 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  element: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L712"></a><span id="L712" class="LineNr">712 </span>    <span class="Comment">// End Load Container Element Definition</span>
-<a name="L713"></a><span id="L713" class="LineNr">713 </span>  <span class="Delimiter">}</span>
-<a name="L714"></a><span id="L714" class="LineNr">714 </span><span class="Delimiter">}</span>
-<a name="L715"></a><span id="L715" class="LineNr">715 </span>
-<a name="L716"></a><span id="L716" class="LineNr">716 </span><span class="Normal">void</span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L717"></a><span id="L717" class="LineNr">717 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L718"></a><span id="L718" class="LineNr">718 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L719"></a><span id="L719" class="LineNr">719 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-<a name="L720"></a><span id="L720" class="LineNr">720 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
-<a name="L721"></a><span id="L721" class="LineNr">721 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L722"></a><span id="L722" class="LineNr">722 </span>  <span class="Delimiter">}</span>
-<a name="L723"></a><span id="L723" class="LineNr">723 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<a name="L724"></a><span id="L724" class="LineNr">724 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L725"></a><span id="L725" class="LineNr">725 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-<a name="L726"></a><span id="L726" class="LineNr">726 </span>  <span class="Delimiter">}</span>
-<a name="L727"></a><span id="L727" class="LineNr">727 </span>  <span class="Comment">// End insert_container Special-cases</span>
-<a name="L728"></a><span id="L728" class="LineNr">728 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// used in recipe types</span>
-<a name="L729"></a><span id="L729" class="LineNr">729 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
-<a name="L730"></a><span id="L730" class="LineNr">730 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-<a name="L731"></a><span id="L731" class="LineNr">731 </span>  <span class="Delimiter">}</span>
-<a name="L732"></a><span id="L732" class="LineNr">732 </span><span class="Delimiter">}</span>
-<a name="L733"></a><span id="L733" class="LineNr">733 </span>
-<a name="L734"></a><span id="L734" class="LineNr">734 </span><span class="Normal">void</span> skip_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L735"></a><span id="L735" class="LineNr">735 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
-<a name="L736"></a><span id="L736" class="LineNr">736 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span>
-<a name="L737"></a><span id="L737" class="LineNr">737 </span>    raise &lt;&lt; message &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L738"></a><span id="L738" class="LineNr">738 </span><span class="Delimiter">}</span>
-<a name="L739"></a><span id="L739" class="LineNr">739 </span>
-<a name="L740"></a><span id="L740" class="LineNr">740 </span><span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span>
-<a name="L741"></a><span id="L741" class="LineNr">741 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L742"></a><span id="L742" class="LineNr">742 </span><span class="muData">container</span> foo [
-<a name="L743"></a><span id="L743" class="LineNr">743 </span>  <span class="Normal">x</span>:num y:num
-<a name="L744"></a><span id="L744" class="LineNr">744 </span>]
-<a name="L745"></a><span id="L745" class="LineNr">745 </span><span class="traceContains">+error: container 'foo' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span>
-<a name="L746"></a><span id="L746" class="LineNr">746 </span>
-<a name="L747"></a><span id="L747" class="LineNr">747 </span><span class="Comment">//: support type abbreviations in container definitions</span>
-<a name="L748"></a><span id="L748" class="LineNr">748 </span>
-<a name="L749"></a><span id="L749" class="LineNr">749 </span><span class="Delimiter">:(scenario type_abbreviations_in_containers)</span>
-<a name="L750"></a><span id="L750" class="LineNr">750 </span><span class="muData">type</span> foo = number
-<a name="L751"></a><span id="L751" class="LineNr">751 </span><span class="muData">container</span> bar [
-<a name="L752"></a><span id="L752" class="LineNr">752 </span>  <span class="Normal">x</span>:foo
-<a name="L753"></a><span id="L753" class="LineNr">753 </span>]
-<a name="L754"></a><span id="L754" class="LineNr">754 </span><span class="muRecipe">def</span> main [
-<a name="L755"></a><span id="L755" class="LineNr">755 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
-<a name="L756"></a><span id="L756" class="LineNr">756 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
-<a name="L757"></a><span id="L757" class="LineNr">757 </span>]
-<a name="L758"></a><span id="L758" class="LineNr">758 </span><span class="traceContains">+mem: storing 34 in location 2</span>
-<a name="L759"></a><span id="L759" class="LineNr">759 </span>
-<a name="L760"></a><span id="L760" class="LineNr">760 </span><span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
-<a name="L761"></a><span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations_in_containers<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<a name="L762"></a><span id="L762" class="LineNr">762 </span><span class="Delimiter">:(code)</span>
-<a name="L763"></a><span id="L763" class="LineNr">763 </span><span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span>
-<a name="L764"></a><span id="L764" class="LineNr">764 </span><span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span>
-<a name="L765"></a><span id="L765" class="LineNr">765 </span><span class="Normal">void</span> expand_type_abbreviations_in_containers<span class="Delimiter">(</span>unused <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L766"></a><span id="L766" class="LineNr">766 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L767"></a><span id="L767" class="LineNr">767 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L768"></a><span id="L768" class="LineNr">768 </span>      expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
-<a name="L769"></a><span id="L769" class="LineNr">769 </span>  <span class="Delimiter">}</span>
-<a name="L770"></a><span id="L770" class="LineNr">770 </span><span class="Delimiter">}</span>
-<a name="L771"></a><span id="L771" class="LineNr">771 </span>
-<a name="L772"></a><span id="L772" class="LineNr">772 </span><span class="Comment">//: ensure scenarios are consistent by always starting new container</span>
-<a name="L773"></a><span id="L773" class="LineNr">773 </span><span class="Comment">//: declarations at the same type number</span>
-<a name="L774"></a><span id="L774" class="LineNr">774 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>  <span class="Comment">//: for tests</span>
-<a name="L775"></a><span id="L775" class="LineNr">775 </span>Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
-<a name="L776"></a><span id="L776" class="LineNr">776 </span><span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
-<a name="L777"></a><span id="L777" class="LineNr">777 </span>assert<span class="Delimiter">(</span>Next_type_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
-<a name="L778"></a><span id="L778" class="LineNr">778 </span>
-<a name="L779"></a><span id="L779" class="LineNr">779 </span><span class="Delimiter">:(code)</span>
-<a name="L780"></a><span id="L780" class="LineNr">780 </span><span class="Normal">void</span> test_error_on_transform_all_between_container_definition_and_extension<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L781"></a><span id="L781" class="LineNr">781 </span>  <span class="Comment">// define a container</span>
-<a name="L782"></a><span id="L782" class="LineNr">782 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L783"></a><span id="L783" class="LineNr">783 </span>      <span class="Constant">&quot;  a:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L784"></a><span id="L784" class="LineNr">784 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-<a name="L785"></a><span id="L785" class="LineNr">785 </span>  <span class="Comment">// try to extend the container after transform</span>
-<a name="L786"></a><span id="L786" class="LineNr">786 </span>  transform_all<span class="Delimiter">();</span>
-<a name="L787"></a><span id="L787" class="LineNr">787 </span>  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
-<a name="L788"></a><span id="L788" class="LineNr">788 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
-<a name="L789"></a><span id="L789" class="LineNr">789 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L790"></a><span id="L790" class="LineNr">790 </span>      <span class="Constant">&quot;  b:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
-<a name="L791"></a><span id="L791" class="LineNr">791 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
-<a name="L792"></a><span id="L792" class="LineNr">792 </span>  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
-<a name="L793"></a><span id="L793" class="LineNr">793 </span><span class="Delimiter">}</span>
-<a name="L794"></a><span id="L794" class="LineNr">794 </span>
-<a name="L795"></a><span id="L795" class="LineNr">795 </span><span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span>
-<a name="L796"></a><span id="L796" class="LineNr">796 </span><span class="SalientComment">//:: can't find a definition at the end.</span>
-<a name="L797"></a><span id="L797" class="LineNr">797 </span>
-<a name="L798"></a><span id="L798" class="LineNr">798 </span><span class="Delimiter">:(scenario run_complains_on_unknown_types)</span>
-<a name="L799"></a><span id="L799" class="LineNr">799 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L800"></a><span id="L800" class="LineNr">800 </span><span class="muRecipe">def</span> main [
-<a name="L801"></a><span id="L801" class="LineNr">801 </span>  <span class="Comment"># integer is not a type</span>
-<a name="L802"></a><span id="L802" class="LineNr">802 </span>  <span class="Constant">1</span>:integer<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
-<a name="L803"></a><span id="L803" class="LineNr">803 </span>]
-<a name="L804"></a><span id="L804" class="LineNr">804 </span><span class="traceContains">+error: main: unknown type integer in '1:integer &lt;- copy 0'</span>
-<a name="L805"></a><span id="L805" class="LineNr">805 </span>
-<a name="L806"></a><span id="L806" class="LineNr">806 </span><span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span>
-<a name="L807"></a><span id="L807" class="LineNr">807 </span><span class="muRecipe">def</span> main [
-<a name="L808"></a><span id="L808" class="LineNr">808 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
-<a name="L809"></a><span id="L809" class="LineNr">809 </span>]
-<a name="L810"></a><span id="L810" class="LineNr">810 </span><span class="muData">container</span> bar [
-<a name="L811"></a><span id="L811" class="LineNr">811 </span>  <span class="Normal">x</span>:num
-<a name="L812"></a><span id="L812" class="LineNr">812 </span>]
-<a name="L813"></a><span id="L813" class="LineNr">813 </span>$error: <span class="Constant">0</span>
-<a name="L814"></a><span id="L814" class="LineNr">814 </span>
-<a name="L815"></a><span id="L815" class="LineNr">815 </span><span class="Delimiter">:(before &quot;End Type Modifying Transforms&quot;)</span>
-<a name="L816"></a><span id="L816" class="LineNr">816 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_invalid_types<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
-<a name="L817"></a><span id="L817" class="LineNr">817 </span>
-<a name="L818"></a><span id="L818" class="LineNr">818 </span><span class="Delimiter">:(code)</span>
-<a name="L819"></a><span id="L819" class="LineNr">819 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L820"></a><span id="L820" class="LineNr">820 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
-<a name="L821"></a><span id="L821" class="LineNr">821 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check for invalid types in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L822"></a><span id="L822" class="LineNr">822 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L823"></a><span id="L823" class="LineNr">823 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
-<a name="L824"></a><span id="L824" class="LineNr">824 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L825"></a><span id="L825" class="LineNr">825 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
-<a name="L826"></a><span id="L826" class="LineNr">826 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L827"></a><span id="L827" class="LineNr">827 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
-<a name="L828"></a><span id="L828" class="LineNr">828 </span>  <span class="Delimiter">}</span>
-<a name="L829"></a><span id="L829" class="LineNr">829 </span>  <span class="Comment">// End check_or_set_invalid_types</span>
-<a name="L830"></a><span id="L830" class="LineNr">830 </span><span class="Delimiter">}</span>
-<a name="L831"></a><span id="L831" class="LineNr">831 </span>
-<a name="L832"></a><span id="L832" class="LineNr">832 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L833"></a><span id="L833" class="LineNr">833 </span>  <span class="Comment">// Begin check_or_set_invalid_types(r)</span>
-<a name="L834"></a><span id="L834" class="LineNr">834 </span>  check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;'&quot;</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
-<a name="L835"></a><span id="L835" class="LineNr">835 </span><span class="Delimiter">}</span>
-<a name="L836"></a><span id="L836" class="LineNr">836 </span>
-<a name="L837"></a><span id="L837" class="LineNr">837 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L838"></a><span id="L838" class="LineNr">838 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L839"></a><span id="L839" class="LineNr">839 </span>  <span class="Comment">// End Container Type Checks</span>
-<a name="L840"></a><span id="L840" class="LineNr">840 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L841"></a><span id="L841" class="LineNr">841 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-<a name="L842"></a><span id="L842" class="LineNr">842 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-<a name="L843"></a><span id="L843" class="LineNr">843 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L844"></a><span id="L844" class="LineNr">844 </span>  <span class="Delimiter">}</span>
-<a name="L845"></a><span id="L845" class="LineNr">845 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L846"></a><span id="L846" class="LineNr">846 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
-<a name="L847"></a><span id="L847" class="LineNr">847 </span>    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
-<a name="L848"></a><span id="L848" class="LineNr">848 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
-<a name="L849"></a><span id="L849" class="LineNr">849 </span>      type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
-<a name="L850"></a><span id="L850" class="LineNr">850 </span>    <span class="Normal">else</span>
-<a name="L851"></a><span id="L851" class="LineNr">851 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type &quot;</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L852"></a><span id="L852" class="LineNr">852 </span>  <span class="Delimiter">}</span>
-<a name="L853"></a><span id="L853" class="LineNr">853 </span><span class="Delimiter">}</span>
-<a name="L854"></a><span id="L854" class="LineNr">854 </span>
-<a name="L855"></a><span id="L855" class="LineNr">855 </span><span class="Delimiter">:(scenario container_unknown_field)</span>
-<a name="L856"></a><span id="L856" class="LineNr">856 </span><span class="Special">% Hide_errors = true;</span>
-<a name="L857"></a><span id="L857" class="LineNr">857 </span><span class="muData">container</span> foo [
-<a name="L858"></a><span id="L858" class="LineNr">858 </span>  <span class="Normal">x</span>:num
-<a name="L859"></a><span id="L859" class="LineNr">859 </span>  <span class="Normal">y</span>:bar
-<a name="L860"></a><span id="L860" class="LineNr">860 </span>]
-<a name="L861"></a><span id="L861" class="LineNr">861 </span><span class="traceContains">+error: foo: unknown type in y</span>
-<a name="L862"></a><span id="L862" class="LineNr">862 </span>
-<a name="L863"></a><span id="L863" class="LineNr">863 </span><span class="Delimiter">:(scenario read_container_with_bracket_in_comment)</span>
-<a name="L864"></a><span id="L864" class="LineNr">864 </span><span class="muData">container</span> foo [
-<a name="L865"></a><span id="L865" class="LineNr">865 </span>  <span class="Normal">x</span>:num
-<a name="L866"></a><span id="L866" class="LineNr">866 </span>  <span class="Comment"># ']' in comment</span>
-<a name="L867"></a><span id="L867" class="LineNr">867 </span>  <span class="Normal">y</span>:num
-<a name="L868"></a><span id="L868" class="LineNr">868 </span>]
-<a name="L869"></a><span id="L869" class="LineNr">869 </span><span class="traceContains">+parse: --- defining container foo</span>
-<a name="L870"></a><span id="L870" class="LineNr">870 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
-<a name="L871"></a><span id="L871" class="LineNr">871 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
-<a name="L872"></a><span id="L872" class="LineNr">872 </span>
-<a name="L873"></a><span id="L873" class="LineNr">873 </span><span class="Delimiter">:(scenario container_with_compound_field_type)</span>
-<a name="L874"></a><span id="L874" class="LineNr">874 </span><span class="muData">container</span> foo [
-<a name="L875"></a><span id="L875" class="LineNr">875 </span>  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>address array <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span>
-<a name="L876"></a><span id="L876" class="LineNr">876 </span>]
-<a name="L877"></a><span id="L877" class="LineNr">877 </span>$error: <span class="Constant">0</span>
-<a name="L878"></a><span id="L878" class="LineNr">878 </span>
-<a name="L879"></a><span id="L879" class="LineNr">879 </span><span class="Delimiter">:(before &quot;End transform_all&quot;)</span>
-<a name="L880"></a><span id="L880" class="LineNr">880 </span>check_container_field_types<span class="Delimiter">();</span>
-<a name="L881"></a><span id="L881" class="LineNr">881 </span>
-<a name="L882"></a><span id="L882" class="LineNr">882 </span><span class="Delimiter">:(code)</span>
-<a name="L883"></a><span id="L883" class="LineNr">883 </span><span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
-<a name="L884"></a><span id="L884" class="LineNr">884 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L885"></a><span id="L885" class="LineNr">885 </span>    <span class="Normal">const</span> type_info&amp; info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
-<a name="L886"></a><span id="L886" class="LineNr">886 </span>    <span class="Comment">// Check Container Field Types(info)</span>
-<a name="L887"></a><span id="L887" class="LineNr">887 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
-<a name="L888"></a><span id="L888" class="LineNr">888 </span>      check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
-<a name="L889"></a><span id="L889" class="LineNr">889 </span>  <span class="Delimiter">}</span>
-<a name="L890"></a><span id="L890" class="LineNr">890 </span><span class="Delimiter">}</span>
-<a name="L891"></a><span id="L891" class="LineNr">891 </span>
-<a name="L892"></a><span id="L892" class="LineNr">892 </span><span class="Normal">void</span> check_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L893"></a><span id="L893" class="LineNr">893 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// will throw a more precise error elsewhere</span>
-<a name="L894"></a><span id="L894" class="LineNr">894 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
-<a name="L895"></a><span id="L895" class="LineNr">895 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-<a name="L896"></a><span id="L896" class="LineNr">896 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
-<a name="L897"></a><span id="L897" class="LineNr">897 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
-<a name="L898"></a><span id="L898" class="LineNr">898 </span>  <span class="Delimiter">}</span>
-<a name="L899"></a><span id="L899" class="LineNr">899 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// value 0 = compound types (layer parse_tree) or type ingredients (layer shape_shifting_container)</span>
-<a name="L900"></a><span id="L900" class="LineNr">900 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span>
-<a name="L901"></a><span id="L901" class="LineNr">901 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
-<a name="L902"></a><span id="L902" class="LineNr">902 </span>  <span class="Delimiter">}</span>
-<a name="L903"></a><span id="L903" class="LineNr">903 </span><span class="Delimiter">}</span>
+<span id="L1" class="LineNr">  1 </span><span class="Comment">//: Containers contain a fixed number of elements of different types.</span>
+<span id="L2" class="LineNr">  2 </span>
+<span id="L3" class="LineNr">  3 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<span id="L4" class="LineNr">  4 </span><span class="Comment">//: We'll use this container as a running example in scenarios below.</span>
+<span id="L5" class="LineNr">  5 </span>type_ordinal point = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<span id="L6" class="LineNr">  6 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
+<span id="L7" class="LineNr">  7 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
+<span id="L8" class="LineNr">  8 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>name = <span class="Constant">&quot;point&quot;</span><span class="Delimiter">;</span>
+<span id="L9" class="LineNr">  9 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;x:number&quot;</span><span class="Delimiter">));</span>
+<span id="L10" class="LineNr"> 10 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;y:number&quot;</span><span class="Delimiter">));</span>
+<span id="L11" class="LineNr"> 11 </span>
+<span id="L12" class="LineNr"> 12 </span><span class="Comment">//: Containers can be copied around with a single instruction just like</span>
+<span id="L13" class="LineNr"> 13 </span><span class="Comment">//: numbers, no matter how large they are.</span>
+<span id="L14" class="LineNr"> 14 </span>
+<span id="L15" class="LineNr"> 15 </span><span class="Comment">//: Tests in this layer often explicitly set up memory before reading it as a</span>
+<span id="L16" class="LineNr"> 16 </span><span class="Comment">//: container. Don't do this in general. I'm tagging exceptions with /unsafe to</span>
+<span id="L17" class="LineNr"> 17 </span><span class="Comment">//: skip later checks.</span>
+<span id="L18" class="LineNr"> 18 </span><span class="Delimiter">:(scenario copy_multiple_locations)</span>
+<span id="L19" class="LineNr"> 19 </span><span class="muRecipe">def</span> main [
+<span id="L20" class="LineNr"> 20 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L21" class="LineNr"> 21 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L22" class="LineNr"> 22 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:point/unsafe
+<span id="L23" class="LineNr"> 23 </span>]
+<span id="L24" class="LineNr"> 24 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<span id="L25" class="LineNr"> 25 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<span id="L26" class="LineNr"> 26 </span>
+<span id="L27" class="LineNr"> 27 </span><span class="Comment">//: trying to copy to a differently-typed destination will fail</span>
+<span id="L28" class="LineNr"> 28 </span><span class="Delimiter">:(scenario copy_checks_size)</span>
+<span id="L29" class="LineNr"> 29 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L30" class="LineNr"> 30 </span><span class="muRecipe">def</span> main [
+<span id="L31" class="LineNr"> 31 </span>  <span class="Constant">2</span>:point<span class="Special"> &lt;- </span>copy <span class="Constant">1</span>:num
+<span id="L32" class="LineNr"> 32 </span>]
+<span id="L33" class="LineNr"> 33 </span><span class="traceContains">+error: main: can't copy '1:num' to '2:point'; types don't match</span>
+<span id="L34" class="LineNr"> 34 </span>
+<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
+<span id="L36" class="LineNr"> 36 </span><span class="Comment">// A more complex example container, containing another container as one of</span>
+<span id="L37" class="LineNr"> 37 </span><span class="Comment">// its elements.</span>
+<span id="L38" class="LineNr"> 38 </span>type_ordinal point_number = put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<span id="L39" class="LineNr"> 39 </span>get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">);</span>  <span class="Comment">// initialize</span>
+<span id="L40" class="LineNr"> 40 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>kind = CONTAINER<span class="Delimiter">;</span>
+<span id="L41" class="LineNr"> 41 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>name = <span class="Constant">&quot;point-number&quot;</span><span class="Delimiter">;</span>
+<span id="L42" class="LineNr"> 42 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;xy:point&quot;</span><span class="Delimiter">));</span>
+<span id="L43" class="LineNr"> 43 </span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> point_number<span class="Delimiter">).</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span><span class="Constant">&quot;z:number&quot;</span><span class="Delimiter">));</span>
+<span id="L44" class="LineNr"> 44 </span>
+<span id="L45" class="LineNr"> 45 </span><span class="Delimiter">:(scenario copy_handles_nested_container_elements)</span>
+<span id="L46" class="LineNr"> 46 </span><span class="muRecipe">def</span> main [
+<span id="L47" class="LineNr"> 47 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L48" class="LineNr"> 48 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L49" class="LineNr"> 49 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L50" class="LineNr"> 50 </span>  <span class="Constant">15</span>:point-number<span class="Special"> &lt;- </span>copy <span class="Constant">12</span>:point-number/unsafe
+<span id="L51" class="LineNr"> 51 </span>]
+<span id="L52" class="LineNr"> 52 </span><span class="traceContains">+mem: storing 36 in location 17</span>
+<span id="L53" class="LineNr"> 53 </span>
+<span id="L54" class="LineNr"> 54 </span><span class="Comment">//: products of recipes can include containers</span>
+<span id="L55" class="LineNr"> 55 </span><span class="Delimiter">:(scenario return_container)</span>
+<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> main [
+<span id="L57" class="LineNr"> 57 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>f <span class="Constant">2</span>
+<span id="L58" class="LineNr"> 58 </span>]
+<span id="L59" class="LineNr"> 59 </span><span class="muRecipe">def</span> f [
+<span id="L60" class="LineNr"> 60 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>next-ingredient
+<span id="L61" class="LineNr"> 61 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L62" class="LineNr"> 62 </span>  <span class="Identifier">return</span> <span class="Constant">12</span>:point/<span class="Special">raw</span>
+<span id="L63" class="LineNr"> 63 </span>]
+<span id="L64" class="LineNr"> 64 </span><span class="traceContains">+run: result 0 is [2, 35]</span>
+<span id="L65" class="LineNr"> 65 </span><span class="traceContains">+mem: storing 2 in location 3</span>
+<span id="L66" class="LineNr"> 66 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<span id="L67" class="LineNr"> 67 </span>
+<span id="L68" class="LineNr"> 68 </span><span class="Comment">//: Containers can be checked for equality with a single instruction just like</span>
+<span id="L69" class="LineNr"> 69 </span><span class="Comment">//: numbers, no matter how large they are.</span>
+<span id="L70" class="LineNr"> 70 </span>
+<span id="L71" class="LineNr"> 71 </span><span class="Delimiter">:(scenario compare_multiple_locations)</span>
+<span id="L72" class="LineNr"> 72 </span><span class="muRecipe">def</span> main [
+<span id="L73" class="LineNr"> 73 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<span id="L74" class="LineNr"> 74 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L75" class="LineNr"> 75 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L76" class="LineNr"> 76 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
+<span id="L77" class="LineNr"> 77 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L78" class="LineNr"> 78 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L79" class="LineNr"> 79 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
+<span id="L80" class="LineNr"> 80 </span>]
+<span id="L81" class="LineNr"> 81 </span><span class="traceContains">+mem: storing 1 in location 7</span>
+<span id="L82" class="LineNr"> 82 </span>
+<span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(scenario compare_multiple_locations_2)</span>
+<span id="L84" class="LineNr"> 84 </span><span class="muRecipe">def</span> main [
+<span id="L85" class="LineNr"> 85 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<span id="L86" class="LineNr"> 86 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L87" class="LineNr"> 87 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L88" class="LineNr"> 88 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># second</span>
+<span id="L89" class="LineNr"> 89 </span>  <span class="Constant">5</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L90" class="LineNr"> 90 </span>  <span class="Constant">6</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">37</span>  <span class="Comment"># different</span>
+<span id="L91" class="LineNr"> 91 </span>  <span class="Constant">7</span>:<span class="Normal">bool</span><span class="Special"> &lt;- </span>equal <span class="Constant">1</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">4</span>:point-number/unsafe
+<span id="L92" class="LineNr"> 92 </span>]
+<span id="L93" class="LineNr"> 93 </span><span class="traceContains">+mem: storing 0 in location 7</span>
+<span id="L94" class="LineNr"> 94 </span>
+<span id="L95" class="LineNr"> 95 </span><span class="Comment">//: Can't put this in type_info because later layers will add support for more</span>
+<span id="L96" class="LineNr"> 96 </span><span class="Comment">//: complex type trees where metadata depends on *combinations* of types.</span>
+<span id="L97" class="LineNr"> 97 </span><span class="Delimiter">:(before &quot;struct reagent&quot;)</span>
+<span id="L98" class="LineNr"> 98 </span><span class="Normal">struct</span> container_metadata <span class="Delimiter">{</span>
+<span id="L99" class="LineNr"> 99 </span>  <span class="Normal">int</span> size<span class="Delimiter">;</span>
+<span id="L100" class="LineNr">100 </span>  vector&lt;<span class="Normal">int</span>&gt; offset<span class="Delimiter">;</span>  <span class="Comment">// not used by exclusive containers</span>
+<span id="L101" class="LineNr">101 </span>  <span class="Comment">// End container_metadata Fields</span>
+<span id="L102" class="LineNr">102 </span>  container_metadata<span class="Delimiter">()</span> :size<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L103" class="LineNr">103 </span>    <span class="Comment">// End container_metadata Constructor</span>
+<span id="L104" class="LineNr">104 </span>  <span class="Delimiter">}</span>
+<span id="L105" class="LineNr">105 </span><span class="Delimiter">};</span>
+<span id="L106" class="LineNr">106 </span><span class="Delimiter">:(before &quot;End reagent Fields&quot;)</span>
+<span id="L107" class="LineNr">107 </span>container_metadata metadata<span class="Delimiter">;</span>  <span class="Comment">// can't be a pointer into Container_metadata because we keep changing the base storage when we save/restore snapshots</span>
+<span id="L108" class="LineNr">108 </span><span class="Delimiter">:(before &quot;End reagent Copy Operator&quot;)</span>
+<span id="L109" class="LineNr">109 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
+<span id="L110" class="LineNr">110 </span><span class="Delimiter">:(before &quot;End reagent Copy Constructor&quot;)</span>
+<span id="L111" class="LineNr">111 </span>metadata = other<span class="Delimiter">.</span>metadata<span class="Delimiter">;</span>
+<span id="L112" class="LineNr">112 </span>
+<span id="L113" class="LineNr">113 </span><span class="Delimiter">:(before &quot;End Globals&quot;)</span>
+<span id="L114" class="LineNr">114 </span><span class="Comment">// todo: switch to map after figuring out how to consistently compare type trees</span>
+<span id="L115" class="LineNr">115 </span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt; Container_metadata<span class="Delimiter">,</span> Container_metadata_snapshot<span class="Delimiter">;</span>
+<span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before &quot;End save_snapshots&quot;)</span>
+<span id="L117" class="LineNr">117 </span>Container_metadata_snapshot = Container_metadata<span class="Delimiter">;</span>
+<span id="L118" class="LineNr">118 </span><span class="Delimiter">:(before &quot;End restore_snapshots&quot;)</span>
+<span id="L119" class="LineNr">119 </span>restore_container_metadata<span class="Delimiter">();</span>
+<span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;End One-time Setup&quot;)</span>
+<span id="L121" class="LineNr">121 </span>atexit<span class="Delimiter">(</span>clear_container_metadata<span class="Delimiter">);</span>
+<span id="L122" class="LineNr">122 </span><span class="Delimiter">:(code)</span>
+<span id="L123" class="LineNr">123 </span><span class="Comment">// invariant: Container_metadata always contains a superset of Container_metadata_snapshot</span>
+<span id="L124" class="LineNr">124 </span><span class="Normal">void</span> restore_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L125" class="LineNr">125 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L126" class="LineNr">126 </span>    assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
+<span id="L127" class="LineNr">127 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>i &lt; SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L128" class="LineNr">128 </span>      assert<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first == Container_metadata_snapshot<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">);</span>
+<span id="L129" class="LineNr">129 </span>      <span class="Identifier">continue</span><span class="Delimiter">;</span>
+<span id="L130" class="LineNr">130 </span>    <span class="Delimiter">}</span>
+<span id="L131" class="LineNr">131 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
+<span id="L132" class="LineNr">132 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<span id="L133" class="LineNr">133 </span>  <span class="Delimiter">}</span>
+<span id="L134" class="LineNr">134 </span>  Container_metadata<span class="Delimiter">.</span>resize<span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>Container_metadata_snapshot<span class="Delimiter">));</span>
+<span id="L135" class="LineNr">135 </span><span class="Delimiter">}</span>
+<span id="L136" class="LineNr">136 </span><span class="Normal">void</span> clear_container_metadata<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L137" class="LineNr">137 </span>  Container_metadata_snapshot<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<span id="L138" class="LineNr">138 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L139" class="LineNr">139 </span>    <span class="Normal">delete</span> Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">;</span>
+<span id="L140" class="LineNr">140 </span>    Container_metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first = <span class="Constant">NULL</span><span class="Delimiter">;</span>
+<span id="L141" class="LineNr">141 </span>  <span class="Delimiter">}</span>
+<span id="L142" class="LineNr">142 </span>  Container_metadata<span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
+<span id="L143" class="LineNr">143 </span><span class="Delimiter">}</span>
+<span id="L144" class="LineNr">144 </span>
+<span id="L145" class="LineNr">145 </span><span class="Comment">//: do no work in size_of, simply lookup Container_metadata</span>
+<span id="L146" class="LineNr">146 </span>
+<span id="L147" class="LineNr">147 </span><span class="Delimiter">:(before &quot;End size_of(reagent r) Special-cases&quot;)</span>
+<span id="L148" class="LineNr">148 </span><span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">)</span> <span class="Identifier">return</span> r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">;</span>
+<span id="L149" class="LineNr">149 </span>
+<span id="L150" class="LineNr">150 </span><span class="Delimiter">:(before &quot;End size_of(type) Special-cases&quot;)</span>
+<span id="L151" class="LineNr">151 </span><span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<span id="L152" class="LineNr">152 </span><span class="Comment">// Update base_type in size_of(type)</span>
+<span id="L153" class="LineNr">153 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L154" class="LineNr">154 </span>  raise &lt;&lt; <span class="Constant">&quot;no such type &quot;</span> &lt;&lt; base_type<span class="Delimiter">-&gt;</span>value &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
+<span id="L157" class="LineNr">157 </span>type_info t = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<span id="L158" class="LineNr">158 </span><span class="Normal">if</span> <span class="Delimiter">(</span>t<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L159" class="LineNr">159 </span>  <span class="Comment">// Compute size_of Container</span>
+<span id="L160" class="LineNr">160 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L161" class="LineNr">161 </span>    raise &lt;&lt; <span class="Constant">&quot;unknown size for container type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L162" class="LineNr">162 </span><span class="CommentedCode">//?     DUMP(&quot;&quot;);</span>
+<span id="L163" class="LineNr">163 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
+<span id="L164" class="LineNr">164 </span>  <span class="Delimiter">}</span>
+<span id="L165" class="LineNr">165 </span>  <span class="Identifier">return</span> get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">).</span>size<span class="Delimiter">;</span>
+<span id="L166" class="LineNr">166 </span><span class="Delimiter">}</span>
+<span id="L167" class="LineNr">167 </span>
+<span id="L168" class="LineNr">168 </span><span class="Comment">//: precompute Container_metadata before we need size_of</span>
+<span id="L169" class="LineNr">169 </span><span class="Comment">//: also store a copy in each reagent in each instruction in each recipe</span>
+<span id="L170" class="LineNr">170 </span>
+<span id="L171" class="LineNr">171 </span><span class="Delimiter">:(after &quot;End Type Modifying Transforms&quot;)</span>
+<span id="L172" class="LineNr">172 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>compute_container_sizes<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<span id="L173" class="LineNr">173 </span><span class="Delimiter">:(code)</span>
+<span id="L174" class="LineNr">174 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L175" class="LineNr">175 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<span id="L176" class="LineNr">176 </span>  trace<span class="Delimiter">(</span><span class="Constant">9992</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- compute container sizes for &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L177" class="LineNr">177 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L178" class="LineNr">178 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<span id="L179" class="LineNr">179 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;- compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L180" class="LineNr">180 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L181" class="LineNr">181 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<span id="L182" class="LineNr">182 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L183" class="LineNr">183 </span>      compute_container_sizes<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> <span class="Constant">&quot; in '&quot;</span>+to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span>+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<span id="L184" class="LineNr">184 </span>  <span class="Delimiter">}</span>
+<span id="L185" class="LineNr">185 </span><span class="Delimiter">}</span>
+<span id="L186" class="LineNr">186 </span>
+<span id="L187" class="LineNr">187 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L188" class="LineNr">188 </span>  expand_type_abbreviations<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<span id="L189" class="LineNr">189 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>r<span class="Delimiter">)</span> || is_dummy<span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L190" class="LineNr">190 </span>  reagent rcopy = r<span class="Delimiter">;</span>
+<span id="L191" class="LineNr">191 </span>  <span class="Comment">// Compute Container Size(reagent rcopy)</span>
+<span id="L192" class="LineNr">192 </span>  set&lt;type_tree&gt; pending_metadata<span class="Delimiter">;</span>  <span class="Comment">// might actually be faster to just convert to string rather than compare type_tree directly; so far the difference is negligible</span>
+<span id="L193" class="LineNr">193 </span>  compute_container_sizes<span class="Delimiter">(</span>rcopy<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<span id="L194" class="LineNr">194 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">))</span>
+<span id="L195" class="LineNr">195 </span>    r<span class="Delimiter">.</span>metadata = get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> rcopy<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
+<span id="L197" class="LineNr">197 </span>
+<span id="L198" class="LineNr">198 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L199" class="LineNr">199 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L200" class="LineNr">200 </span>  trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;compute container sizes for &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L201" class="LineNr">201 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L202" class="LineNr">202 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>pending_metadata<span class="Delimiter">,</span> *type<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L203" class="LineNr">203 </span>  pending_metadata<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>*type<span class="Delimiter">);</span>
+<span id="L204" class="LineNr">204 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L205" class="LineNr">205 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L206" class="LineNr">206 </span>      raise &lt;&lt; <span class="Constant">&quot;invalid type &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>type<span class="Delimiter">)</span> &lt;&lt; location_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L207" class="LineNr">207 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L208" class="LineNr">208 </span>    <span class="Delimiter">}</span>
+<span id="L209" class="LineNr">209 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">-&gt;</span>name == <span class="Constant">&quot;address&quot;</span><span class="Delimiter">)</span>
+<span id="L210" class="LineNr">210 </span>      compute_container_sizes<span class="Delimiter">(</span>payload_type<span class="Delimiter">(</span>type<span class="Delimiter">),</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<span id="L211" class="LineNr">211 </span>    <span class="Comment">// End compute_container_sizes Non-atom Special-cases</span>
+<span id="L212" class="LineNr">212 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L213" class="LineNr">213 </span>  <span class="Delimiter">}</span>
+<span id="L214" class="LineNr">214 </span>  assert<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// error raised elsewhere</span>
+<span id="L216" class="LineNr">216 </span>  type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<span id="L217" class="LineNr">217 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">)</span>
+<span id="L218" class="LineNr">218 </span>    compute_container_sizes<span class="Delimiter">(</span>info<span class="Delimiter">,</span> type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<span id="L219" class="LineNr">219 </span>  <span class="Comment">// End compute_container_sizes Atom Special-cases</span>
+<span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
+<span id="L221" class="LineNr">221 </span>
+<span id="L222" class="LineNr">222 </span><span class="Normal">void</span> compute_container_sizes<span class="Delimiter">(</span><span class="Normal">const</span> type_info&amp; container_info<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* full_type<span class="Delimiter">,</span> set&lt;type_tree&gt;&amp; pending_metadata<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L223" class="LineNr">223 </span>  assert<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
+<span id="L224" class="LineNr">224 </span>  <span class="Comment">// size of a container is the sum of the sizes of its element</span>
+<span id="L225" class="LineNr">225 </span>  <span class="Comment">// (So it can only contain arrays if they're static and include their</span>
+<span id="L226" class="LineNr">226 </span>  <span class="Comment">// length in the type.)</span>
+<span id="L227" class="LineNr">227 </span>  container_metadata metadata<span class="Delimiter">;</span>
+<span id="L228" class="LineNr">228 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>container_info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L229" class="LineNr">229 </span>    reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = container_info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
+<span id="L230" class="LineNr">230 </span>    <span class="Comment">// Compute Container Size(element, full_type)</span>
+<span id="L231" class="LineNr">231 </span>    compute_container_sizes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">,</span> pending_metadata<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span>
+<span id="L232" class="LineNr">232 </span>    metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>  <span class="Comment">// save previous size as offset</span>
+<span id="L233" class="LineNr">233 </span>    metadata<span class="Delimiter">.</span>size += size_of<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">);</span>
+<span id="L234" class="LineNr">234 </span>  <span class="Delimiter">}</span>
+<span id="L235" class="LineNr">235 </span>  Container_metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt;<span class="Delimiter">(</span><span class="Normal">new</span> type_tree<span class="Delimiter">(</span>*full_type<span class="Delimiter">),</span> metadata<span class="Delimiter">));</span>
+<span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span>
+<span id="L237" class="LineNr">237 </span>
+<span id="L238" class="LineNr">238 </span><span class="Normal">const</span> type_tree* payload_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L239" class="LineNr">239 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<span id="L240" class="LineNr">240 </span>  <span class="Normal">const</span> type_tree* result = type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">;</span>
+<span id="L241" class="LineNr">241 </span>  assert<span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">);</span>
+<span id="L242" class="LineNr">242 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">-&gt;</span>right<span class="Delimiter">)</span> <span class="Identifier">return</span> result<span class="Delimiter">-&gt;</span>left<span class="Delimiter">;</span>
+<span id="L243" class="LineNr">243 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
+<span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span>
+<span id="L245" class="LineNr">245 </span>
+<span id="L246" class="LineNr">246 </span>container_metadata&amp; get<span class="Delimiter">(</span>vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L247" class="LineNr">247 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L248" class="LineNr">248 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
+<span id="L249" class="LineNr">249 </span>      <span class="Identifier">return</span> all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>second<span class="Delimiter">;</span>
+<span id="L250" class="LineNr">250 </span>  <span class="Delimiter">}</span>
+<span id="L251" class="LineNr">251 </span>  tb_shutdown<span class="Delimiter">();</span>
+<span id="L252" class="LineNr">252 </span>  raise &lt;&lt; <span class="Constant">&quot;unknown size for type '&quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>key<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L253" class="LineNr">253 </span>  assert<span class="Delimiter">(</span><span class="Constant">false</span><span class="Delimiter">);</span>
+<span id="L254" class="LineNr">254 </span><span class="Delimiter">}</span>
+<span id="L255" class="LineNr">255 </span>
+<span id="L256" class="LineNr">256 </span><span class="Normal">bool</span> contains_key<span class="Delimiter">(</span><span class="Normal">const</span> vector&lt;pair&lt;type_tree*<span class="Delimiter">,</span> container_metadata&gt; &gt;&amp; all<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* key<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L257" class="LineNr">257 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>all<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L258" class="LineNr">258 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>matches<span class="Delimiter">(</span>all<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>first<span class="Delimiter">,</span> key<span class="Delimiter">))</span>
+<span id="L259" class="LineNr">259 </span>      <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<span id="L260" class="LineNr">260 </span>  <span class="Delimiter">}</span>
+<span id="L261" class="LineNr">261 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<span id="L262" class="LineNr">262 </span><span class="Delimiter">}</span>
+<span id="L263" class="LineNr">263 </span>
+<span id="L264" class="LineNr">264 </span><span class="Normal">bool</span> matches<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* a<span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* b<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L265" class="LineNr">265 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a == b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
+<span id="L266" class="LineNr">266 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!a || !b<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<span id="L267" class="LineNr">267 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom != b<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
+<span id="L268" class="LineNr">268 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Identifier">return</span> a<span class="Delimiter">-&gt;</span>value == b<span class="Delimiter">-&gt;</span>value<span class="Delimiter">;</span>
+<span id="L269" class="LineNr">269 </span>  <span class="Identifier">return</span> matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>left<span class="Delimiter">)</span> &amp;&amp; matches<span class="Delimiter">(</span>a<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> b<span class="Delimiter">-&gt;</span>right<span class="Delimiter">);</span>
+<span id="L270" class="LineNr">270 </span><span class="Delimiter">}</span>
+<span id="L271" class="LineNr">271 </span>
+<span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenario stash_container)</span>
+<span id="L273" class="LineNr">273 </span><span class="muRecipe">def</span> main [
+<span id="L274" class="LineNr">274 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>  <span class="Comment"># first</span>
+<span id="L275" class="LineNr">275 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L276" class="LineNr">276 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L277" class="LineNr">277 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:point-number/<span class="Special">raw</span>
+<span id="L278" class="LineNr">278 </span>]
+<span id="L279" class="LineNr">279 </span><span class="traceContains">+app: foo: 34 35 36</span>
+<span id="L280" class="LineNr">280 </span>
+<span id="L281" class="LineNr">281 </span><span class="Comment">//: for the following unit tests we'll do the work of the transform by hand</span>
+<span id="L282" class="LineNr">282 </span>
+<span id="L283" class="LineNr">283 </span><span class="Delimiter">:(before &quot;End Unit Tests&quot;)</span>
+<span id="L284" class="LineNr">284 </span><span class="Normal">void</span> test_container_sizes<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L285" class="LineNr">285 </span>  <span class="Comment">// a container we don't have the size for</span>
+<span id="L286" class="LineNr">286 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<span id="L287" class="LineNr">287 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L288" class="LineNr">288 </span>  <span class="Comment">// scan</span>
+<span id="L289" class="LineNr">289 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<span id="L290" class="LineNr">290 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<span id="L291" class="LineNr">291 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L292" class="LineNr">292 </span>  <span class="Comment">// the global table also knows its size</span>
+<span id="L293" class="LineNr">293 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L294" class="LineNr">294 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L295" class="LineNr">295 </span><span class="Delimiter">}</span>
+<span id="L296" class="LineNr">296 </span>
+<span id="L297" class="LineNr">297 </span><span class="Normal">void</span> test_container_sizes_through_aliases<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L298" class="LineNr">298 </span>  <span class="Comment">// a new alias for a container</span>
+<span id="L299" class="LineNr">299 </span>  put<span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;pt&quot;</span><span class="Delimiter">,</span> new_type_tree<span class="Delimiter">(</span><span class="Constant">&quot;point&quot;</span><span class="Delimiter">));</span>
+<span id="L300" class="LineNr">300 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:pt&quot;</span><span class="Delimiter">);</span>
+<span id="L301" class="LineNr">301 </span>  <span class="Comment">// scan</span>
+<span id="L302" class="LineNr">302 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<span id="L303" class="LineNr">303 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<span id="L304" class="LineNr">304 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L305" class="LineNr">305 </span>  <span class="Comment">// the global table also knows its size</span>
+<span id="L306" class="LineNr">306 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L307" class="LineNr">307 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L308" class="LineNr">308 </span><span class="Delimiter">}</span>
+<span id="L309" class="LineNr">309 </span>
+<span id="L310" class="LineNr">310 </span><span class="Normal">void</span> test_container_sizes_nested<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L311" class="LineNr">311 </span>  <span class="Comment">// a container we don't have the size for</span>
+<span id="L312" class="LineNr">312 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:point-number&quot;</span><span class="Delimiter">);</span>
+<span id="L313" class="LineNr">313 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L314" class="LineNr">314 </span>  <span class="Comment">// scan</span>
+<span id="L315" class="LineNr">315 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<span id="L316" class="LineNr">316 </span>  <span class="Comment">// the reagent we scanned knows its size</span>
+<span id="L317" class="LineNr">317 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<span id="L318" class="LineNr">318 </span>  <span class="Comment">// the global table also knows its size</span>
+<span id="L319" class="LineNr">319 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L320" class="LineNr">320 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> r<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">3</span><span class="Delimiter">);</span>
+<span id="L321" class="LineNr">321 </span><span class="Delimiter">}</span>
+<span id="L322" class="LineNr">322 </span>
+<span id="L323" class="LineNr">323 </span><span class="Normal">void</span> test_container_sizes_recursive<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L324" class="LineNr">324 </span>  <span class="Comment">// define a container containing an address to itself</span>
+<span id="L325" class="LineNr">325 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L326" class="LineNr">326 </span>      <span class="Constant">&quot;  x:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L327" class="LineNr">327 </span>      <span class="Constant">&quot;  y:address:foo</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L328" class="LineNr">328 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<span id="L329" class="LineNr">329 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:foo&quot;</span><span class="Delimiter">);</span>
+<span id="L330" class="LineNr">330 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<span id="L331" class="LineNr">331 </span>  CHECK_EQ<span class="Delimiter">(</span>r<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L332" class="LineNr">332 </span><span class="Delimiter">}</span>
+<span id="L333" class="LineNr">333 </span>
+<span id="L334" class="LineNr">334 </span><span class="Normal">void</span> test_container_sizes_from_address<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L335" class="LineNr">335 </span>  <span class="Comment">// a container we don't have the size for</span>
+<span id="L336" class="LineNr">336 </span>  reagent container<span class="Delimiter">(</span><span class="Constant">&quot;x:point&quot;</span><span class="Delimiter">);</span>
+<span id="L337" class="LineNr">337 </span>  CHECK<span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L338" class="LineNr">338 </span>  <span class="Comment">// scanning an address to the container precomputes the size of the container</span>
+<span id="L339" class="LineNr">339 </span>  reagent r<span class="Delimiter">(</span><span class="Constant">&quot;x:address:point&quot;</span><span class="Delimiter">);</span>
+<span id="L340" class="LineNr">340 </span>  compute_container_sizes<span class="Delimiter">(</span>r<span class="Delimiter">,</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">);</span>
+<span id="L341" class="LineNr">341 </span>  CHECK<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">));</span>
+<span id="L342" class="LineNr">342 </span>  CHECK_EQ<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Container_metadata<span class="Delimiter">,</span> container<span class="Delimiter">.</span>type<span class="Delimiter">).</span>size<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L343" class="LineNr">343 </span><span class="Delimiter">}</span>
+<span id="L344" class="LineNr">344 </span>
+<span id="L345" class="LineNr">345 </span><span class="SalientComment">//:: To access elements of a container, use 'get'</span>
+<span id="L346" class="LineNr">346 </span><span class="Comment">//: 'get' takes a 'base' container and an 'offset' into it and returns the</span>
+<span id="L347" class="LineNr">347 </span><span class="Comment">//: appropriate element of the container value.</span>
+<span id="L348" class="LineNr">348 </span>
+<span id="L349" class="LineNr">349 </span><span class="Delimiter">:(scenario get)</span>
+<span id="L350" class="LineNr">350 </span><span class="muRecipe">def</span> main [
+<span id="L351" class="LineNr">351 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L352" class="LineNr">352 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L353" class="LineNr">353 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<span id="L354" class="LineNr">354 </span>]
+<span id="L355" class="LineNr">355 </span><span class="traceContains">+mem: storing 35 in location 15</span>
+<span id="L356" class="LineNr">356 </span>
+<span id="L357" class="LineNr">357 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<span id="L358" class="LineNr">358 </span>GET<span class="Delimiter">,</span>
+<span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<span id="L360" class="LineNr">360 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;get&quot;</span><span class="Delimiter">,</span> GET<span class="Delimiter">);</span>
+<span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<span id="L362" class="LineNr">362 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
+<span id="L363" class="LineNr">363 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L364" class="LineNr">364 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get' expects exactly 2 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L365" class="LineNr">365 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L366" class="LineNr">366 </span>  <span class="Delimiter">}</span>
+<span id="L367" class="LineNr">367 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>  <span class="Comment">// new copy for every invocation</span>
+<span id="L368" class="LineNr">368 </span>  <span class="Comment">// Update GET base in Check</span>
+<span id="L369" class="LineNr">369 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L370" class="LineNr">370 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L371" class="LineNr">371 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L372" class="LineNr">372 </span>  <span class="Delimiter">}</span>
+<span id="L373" class="LineNr">373 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<span id="L374" class="LineNr">374 </span>  <span class="Comment">// Update GET base_type in Check</span>
+<span id="L375" class="LineNr">375 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L376" class="LineNr">376 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'get' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L377" class="LineNr">377 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L378" class="LineNr">378 </span>  <span class="Delimiter">}</span>
+<span id="L379" class="LineNr">379 </span>  <span class="Normal">const</span> reagent&amp; offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<span id="L380" class="LineNr">380 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L381" class="LineNr">381 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'get' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L382" class="LineNr">382 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L383" class="LineNr">383 </span>  <span class="Delimiter">}</span>
+<span id="L384" class="LineNr">384 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<span id="L385" class="LineNr">385 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
+<span id="L386" class="LineNr">386 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span>
+<span id="L387" class="LineNr">387 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<span id="L388" class="LineNr">388 </span>  <span class="Normal">else</span>
+<span id="L389" class="LineNr">389 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<span id="L390" class="LineNr">390 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L391" class="LineNr">391 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L392" class="LineNr">392 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L393" class="LineNr">393 </span>  <span class="Delimiter">}</span>
+<span id="L394" class="LineNr">394 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L395" class="LineNr">395 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> product = inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L396" class="LineNr">396 </span>  <span class="Comment">// Update GET product in Check</span>
+<span id="L397" class="LineNr">397 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<span id="L398" class="LineNr">398 </span>  <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
+<span id="L399" class="LineNr">399 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>product<span class="Delimiter">,</span> element<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L400" class="LineNr">400 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'get &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; product<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L401" class="LineNr">401 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L402" class="LineNr">402 </span>  <span class="Delimiter">}</span>
+<span id="L403" class="LineNr">403 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L404" class="LineNr">404 </span><span class="Delimiter">}</span>
+<span id="L405" class="LineNr">405 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<span id="L406" class="LineNr">406 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span>
+<span id="L407" class="LineNr">407 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L408" class="LineNr">408 </span>  <span class="Comment">// Update GET base in Run</span>
+<span id="L409" class="LineNr">409 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<span id="L410" class="LineNr">410 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L411" class="LineNr">411 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L412" class="LineNr">412 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L413" class="LineNr">413 </span>  <span class="Delimiter">}</span>
+<span id="L414" class="LineNr">414 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<span id="L415" class="LineNr">415 </span>  <span class="Comment">// Update GET base_type in Run</span>
+<span id="L416" class="LineNr">416 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L417" class="LineNr">417 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
+<span id="L418" class="LineNr">418 </span>  assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span>
+<span id="L419" class="LineNr">419 </span>  <span class="Normal">int</span> src = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
+<span id="L420" class="LineNr">420 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy is &quot;</span> &lt;&lt; src &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L421" class="LineNr">421 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<span id="L422" class="LineNr">422 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span>
+<span id="L423" class="LineNr">423 </span>  element<span class="Delimiter">.</span>set_value<span class="Delimiter">(</span>src<span class="Delimiter">);</span>
+<span id="L424" class="LineNr">424 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;its type is &quot;</span> &lt;&lt; names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L425" class="LineNr">425 </span>  <span class="Comment">// Read element</span>
+<span id="L426" class="LineNr">426 </span>  products<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>read_memory<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
+<span id="L427" class="LineNr">427 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L428" class="LineNr">428 </span><span class="Delimiter">}</span>
+<span id="L429" class="LineNr">429 </span>
+<span id="L430" class="LineNr">430 </span><span class="Delimiter">:(code)</span>
+<span id="L431" class="LineNr">431 </span><span class="Normal">const</span> reagent element_type<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> offset_value<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L432" class="LineNr">432 </span>  assert<span class="Delimiter">(</span>offset_value &gt;= <span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L433" class="LineNr">433 </span>  <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span>
+<span id="L434" class="LineNr">434 </span>  <span class="Comment">// Update base_type in element_type</span>
+<span id="L435" class="LineNr">435 </span>  assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">));</span>
+<span id="L436" class="LineNr">436 </span>  assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<span id="L437" class="LineNr">437 </span>  <span class="Normal">const</span> type_info&amp; info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">);</span>
+<span id="L438" class="LineNr">438 </span>  assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == CONTAINER<span class="Delimiter">);</span>
+<span id="L439" class="LineNr">439 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &gt;= SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">))</span> <span class="Identifier">return</span> reagent<span class="Delimiter">();</span>  <span class="Comment">// error handled elsewhere</span>
+<span id="L440" class="LineNr">440 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset_value<span class="Delimiter">);</span>
+<span id="L441" class="LineNr">441 </span>  <span class="Comment">// End element_type Special-cases</span>
+<span id="L442" class="LineNr">442 </span>  <span class="Identifier">return</span> element<span class="Delimiter">;</span>
+<span id="L443" class="LineNr">443 </span><span class="Delimiter">}</span>
+<span id="L444" class="LineNr">444 </span>
+<span id="L445" class="LineNr">445 </span><span class="Delimiter">:(scenario get_handles_nested_container_elements)</span>
+<span id="L446" class="LineNr">446 </span><span class="muRecipe">def</span> main [
+<span id="L447" class="LineNr">447 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L448" class="LineNr">448 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L449" class="LineNr">449 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L450" class="LineNr">450 </span>  <span class="Constant">15</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<span id="L451" class="LineNr">451 </span>]
+<span id="L452" class="LineNr">452 </span><span class="traceContains">+mem: storing 36 in location 15</span>
+<span id="L453" class="LineNr">453 </span>
+<span id="L454" class="LineNr">454 </span><span class="Delimiter">:(scenario get_out_of_bounds)</span>
+<span id="L455" class="LineNr">455 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L456" class="LineNr">456 </span><span class="muRecipe">def</span> main [
+<span id="L457" class="LineNr">457 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L458" class="LineNr">458 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L459" class="LineNr">459 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L460" class="LineNr">460 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">2:offset</span>  <span class="Comment"># point-number occupies 3 locations but has only 2 fields; out of bounds</span>
+<span id="L461" class="LineNr">461 </span>]
+<span id="L462" class="LineNr">462 </span><span class="traceContains">+error: main: invalid offset '2' for 'point-number'</span>
+<span id="L463" class="LineNr">463 </span>
+<span id="L464" class="LineNr">464 </span><span class="Delimiter">:(scenario get_out_of_bounds_2)</span>
+<span id="L465" class="LineNr">465 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L466" class="LineNr">466 </span><span class="muRecipe">def</span> main [
+<span id="L467" class="LineNr">467 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L468" class="LineNr">468 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L469" class="LineNr">469 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L470" class="LineNr">470 </span>  get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">-1:offset</span>
+<span id="L471" class="LineNr">471 </span>]
+<span id="L472" class="LineNr">472 </span><span class="traceContains">+error: main: invalid offset '-1' for 'point-number'</span>
+<span id="L473" class="LineNr">473 </span>
+<span id="L474" class="LineNr">474 </span><span class="Delimiter">:(scenario get_product_type_mismatch)</span>
+<span id="L475" class="LineNr">475 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L476" class="LineNr">476 </span><span class="muRecipe">def</span> main [
+<span id="L477" class="LineNr">477 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L478" class="LineNr">478 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L479" class="LineNr">479 </span>  <span class="Constant">14</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">36</span>
+<span id="L480" class="LineNr">480 </span>  <span class="Constant">15</span>:address:num<span class="Special"> &lt;- </span>get <span class="Constant">12</span>:point-number/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<span id="L481" class="LineNr">481 </span>]
+<span id="L482" class="LineNr">482 </span><span class="traceContains">+error: main: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span>
+<span id="L483" class="LineNr">483 </span>
+<span id="L484" class="LineNr">484 </span><span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span>
+<span id="L485" class="LineNr">485 </span>
+<span id="L486" class="LineNr">486 </span><span class="Delimiter">:(scenario get_without_product)</span>
+<span id="L487" class="LineNr">487 </span><span class="muRecipe">def</span> main [
+<span id="L488" class="LineNr">488 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L489" class="LineNr">489 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L490" class="LineNr">490 </span>  get <span class="Constant">12</span>:point/<span class="Special">raw</span><span class="Delimiter">,</span> <span class="Constant">1:offset</span>  <span class="Comment"># unsafe</span>
+<span id="L491" class="LineNr">491 </span>]
+<span id="L492" class="LineNr">492 </span><span class="Comment"># just don't die</span>
+<span id="L493" class="LineNr">493 </span>
+<span id="L494" class="LineNr">494 </span><span class="SalientComment">//:: To write to elements of containers, use 'put'.</span>
+<span id="L495" class="LineNr">495 </span>
+<span id="L496" class="LineNr">496 </span><span class="Delimiter">:(scenario put)</span>
+<span id="L497" class="LineNr">497 </span><span class="muRecipe">def</span> main [
+<span id="L498" class="LineNr">498 </span>  <span class="Constant">12</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L499" class="LineNr">499 </span>  <span class="Constant">13</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L500" class="LineNr">500 </span>  $clear-trace
+<span id="L501" class="LineNr">501 </span>  <span class="Constant">12</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">12</span>:point<span class="Delimiter">,</span> <span class="Constant">1:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<span id="L502" class="LineNr">502 </span>]
+<span id="L503" class="LineNr">503 </span><span class="traceContains">+mem: storing 36 in location 13</span>
+<span id="L504" class="LineNr">504 </span><span class="traceAbsent">-mem: storing 34 in location 12</span>
+<span id="L505" class="LineNr">505 </span>
+<span id="L506" class="LineNr">506 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
+<span id="L507" class="LineNr">507 </span>PUT<span class="Delimiter">,</span>
+<span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
+<span id="L509" class="LineNr">509 </span>put<span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;put&quot;</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span>
+<span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
+<span id="L511" class="LineNr">511 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
+<span id="L512" class="LineNr">512 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">3</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L513" class="LineNr">513 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put' expects exactly 3 ingredients in '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L514" class="LineNr">514 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L515" class="LineNr">515 </span>  <span class="Delimiter">}</span>
+<span id="L516" class="LineNr">516 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L517" class="LineNr">517 </span>  <span class="Comment">// Update PUT base in Check</span>
+<span id="L518" class="LineNr">518 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base<span class="Delimiter">.</span>type<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L519" class="LineNr">519 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L520" class="LineNr">520 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L521" class="LineNr">521 </span>  <span class="Delimiter">}</span>
+<span id="L522" class="LineNr">522 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<span id="L523" class="LineNr">523 </span>  <span class="Comment">// Update PUT base_type in Check</span>
+<span id="L524" class="LineNr">524 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-&gt;</span>atom || base_type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>kind != CONTAINER<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L525" class="LineNr">525 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;first ingredient of 'put' should be a container, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L526" class="LineNr">526 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L527" class="LineNr">527 </span>  <span class="Delimiter">}</span>
+<span id="L528" class="LineNr">528 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> offset = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
+<span id="L529" class="LineNr">529 </span>  <span class="Comment">// Update PUT offset in Check</span>
+<span id="L530" class="LineNr">530 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>offset<span class="Delimiter">)</span> || !is_mu_scalar<span class="Delimiter">(</span>offset<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L531" class="LineNr">531 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;second ingredient of 'put' should have type 'offset', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L532" class="LineNr">532 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L533" class="LineNr">533 </span>  <span class="Delimiter">}</span>
+<span id="L534" class="LineNr">534 </span>  <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span>
+<span id="L535" class="LineNr">535 </span>  <span class="Comment">//: later layers will permit non-integer offsets</span>
+<span id="L536" class="LineNr">536 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>is_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L537" class="LineNr">537 </span>    offset_value = to_integer<span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span>
+<span id="L538" class="LineNr">538 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value &lt; <span class="Constant">0</span> || offset_value &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L539" class="LineNr">539 </span>      raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;invalid offset '&quot;</span> &lt;&lt; offset_value &lt;&lt; <span class="Constant">&quot;' for '&quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>name &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L540" class="LineNr">540 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L541" class="LineNr">541 </span>    <span class="Delimiter">}</span>
+<span id="L542" class="LineNr">542 </span>  <span class="Delimiter">}</span>
+<span id="L543" class="LineNr">543 </span>  <span class="Normal">else</span> <span class="Delimiter">{</span>
+<span id="L544" class="LineNr">544 </span>    offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<span id="L545" class="LineNr">545 </span>  <span class="Delimiter">}</span>
+<span id="L546" class="LineNr">546 </span>  <span class="Normal">const</span> reagent&amp; value = inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">);</span>
+<span id="L547" class="LineNr">547 </span>  <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span>
+<span id="L548" class="LineNr">548 </span>  <span class="Normal">const</span> reagent&amp; element = element_type<span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span>
+<span id="L549" class="LineNr">549 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!types_coercible<span class="Delimiter">(</span>element<span class="Delimiter">,</span> value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L550" class="LineNr">550 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'put &quot;</span> &lt;&lt; base<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;, &quot;</span> &lt;&lt; offset<span class="Delimiter">.</span>original_string &lt;&lt; <span class="Constant">&quot;' should write to &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot; but '&quot;</span> &lt;&lt; value<span class="Delimiter">.</span>name &lt;&lt; <span class="Constant">&quot;' has type &quot;</span> &lt;&lt; names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L551" class="LineNr">551 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L552" class="LineNr">552 </span>  <span class="Delimiter">}</span>
+<span id="L553" class="LineNr">553 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// no more checks necessary</span>
+<span id="L554" class="LineNr">554 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name != inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L555" class="LineNr">555 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;product of 'put' must be first ingredient '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;', but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L556" class="LineNr">556 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L557" class="LineNr">557 </span>  <span class="Delimiter">}</span>
+<span id="L558" class="LineNr">558 </span>  <span class="Comment">// End PUT Product Checks</span>
+<span id="L559" class="LineNr">559 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L560" class="LineNr">560 </span><span class="Delimiter">}</span>
+<span id="L561" class="LineNr">561 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
+<span id="L562" class="LineNr">562 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span>
+<span id="L563" class="LineNr">563 </span>  reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> base = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L564" class="LineNr">564 </span>  <span class="Comment">// Update PUT base in Run</span>
+<span id="L565" class="LineNr">565 </span>  <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span>
+<span id="L566" class="LineNr">566 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>base_address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L567" class="LineNr">567 </span>    raise &lt;&lt; maybe<span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;tried to access location 0 in '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L568" class="LineNr">568 </span>    <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L569" class="LineNr">569 </span>  <span class="Delimiter">}</span>
+<span id="L570" class="LineNr">570 </span>  <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span>
+<span id="L571" class="LineNr">571 </span>  <span class="Comment">// Update PUT base_type in Run</span>
+<span id="L572" class="LineNr">572 </span>  <span class="Normal">int</span> offset = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span>
+<span id="L573" class="LineNr">573 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>offset &lt; <span class="Constant">0</span> || offset &gt;= SIZE<span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// copied from Check above</span>
+<span id="L574" class="LineNr">574 </span>  <span class="Normal">int</span> address = base_address + base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>offset<span class="Delimiter">.</span>at<span class="Delimiter">(</span>offset<span class="Delimiter">);</span>
+<span id="L575" class="LineNr">575 </span>  trace<span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;address to copy to is &quot;</span> &lt;&lt; address &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L576" class="LineNr">576 </span>  <span class="Comment">// optimization: directly write the element rather than updating 'product'</span>
+<span id="L577" class="LineNr">577 </span>  <span class="Comment">// and writing the entire container</span>
+<span id="L578" class="LineNr">578 </span>  <span class="Comment">// Write Memory in PUT in Run</span>
+<span id="L579" class="LineNr">579 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L580" class="LineNr">580 </span>    trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing &quot;</span> &lt;&lt; no_scientific<span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; address+i &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L581" class="LineNr">581 </span>    put<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span>
+<span id="L582" class="LineNr">582 </span>  <span class="Delimiter">}</span>
+<span id="L583" class="LineNr">583 </span>  <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span>
+<span id="L584" class="LineNr">584 </span><span class="Delimiter">}</span>
+<span id="L585" class="LineNr">585 </span>
+<span id="L586" class="LineNr">586 </span><span class="Delimiter">:(scenario put_product_error)</span>
+<span id="L587" class="LineNr">587 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L588" class="LineNr">588 </span><span class="muRecipe">def</span> main [
+<span id="L589" class="LineNr">589 </span>  local-scope
+<span id="L590" class="LineNr">590 </span>  load-ingredients
+<span id="L591" class="LineNr">591 </span>  <span class="Constant">1</span>:point<span class="Special"> &lt;- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span>
+<span id="L592" class="LineNr">592 </span>  <span class="Constant">3</span>:point<span class="Special"> &lt;- </span>put <span class="Constant">1</span>:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span><span class="Delimiter">,</span> <span class="Constant">36</span>
+<span id="L593" class="LineNr">593 </span>]
+<span id="L594" class="LineNr">594 </span><span class="traceContains">+error: main: product of 'put' must be first ingredient '1:point', but got '3:point'</span>
+<span id="L595" class="LineNr">595 </span>
+<span id="L596" class="LineNr">596 </span><span class="SalientComment">//:: Allow containers to be defined in Mu code.</span>
+<span id="L597" class="LineNr">597 </span>
+<span id="L598" class="LineNr">598 </span><span class="Delimiter">:(scenarios load)</span>
+<span id="L599" class="LineNr">599 </span><span class="Delimiter">:(scenario container)</span>
+<span id="L600" class="LineNr">600 </span><span class="muData">container</span> foo [
+<span id="L601" class="LineNr">601 </span>  <span class="Normal">x</span>:num
+<span id="L602" class="LineNr">602 </span>  <span class="Normal">y</span>:num
+<span id="L603" class="LineNr">603 </span>]
+<span id="L604" class="LineNr">604 </span><span class="traceContains">+parse: --- defining container foo</span>
+<span id="L605" class="LineNr">605 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
+<span id="L606" class="LineNr">606 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
+<span id="L607" class="LineNr">607 </span>
+<span id="L608" class="LineNr">608 </span><span class="Delimiter">:(scenario container_use_before_definition)</span>
+<span id="L609" class="LineNr">609 </span><span class="muData">container</span> foo [
+<span id="L610" class="LineNr">610 </span>  <span class="Normal">x</span>:num
+<span id="L611" class="LineNr">611 </span>  <span class="Normal">y</span>:bar
+<span id="L612" class="LineNr">612 </span>]
+<span id="L613" class="LineNr">613 </span><span class="muData">container</span> bar [
+<span id="L614" class="LineNr">614 </span>  <span class="Normal">x</span>:num
+<span id="L615" class="LineNr">615 </span>  <span class="Normal">y</span>:num
+<span id="L616" class="LineNr">616 </span>]
+<span id="L617" class="LineNr">617 </span><span class="traceContains">+parse: --- defining container foo</span>
+<span id="L618" class="LineNr">618 </span><span class="traceContains">+parse: type number: 1000</span>
+<span id="L619" class="LineNr">619 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
+<span id="L620" class="LineNr">620 </span><span class="Comment"># todo: brittle</span>
+<span id="L621" class="LineNr">621 </span><span class="Comment"># type bar is unknown at this point, but we assign it a number</span>
+<span id="L622" class="LineNr">622 </span><span class="traceContains">+parse:   element: {y: &quot;bar&quot;}</span>
+<span id="L623" class="LineNr">623 </span><span class="Comment"># later type bar geon</span>
+<span id="L624" class="LineNr">624 </span><span class="traceContains">+parse: --- defining container bar</span>
+<span id="L625" class="LineNr">625 </span><span class="traceContains">+parse: type number: 1001</span>
+<span id="L626" class="LineNr">626 </span><span class="traceContains">+parse:   element: {x: &quot;number&quot;}</span>
+<span id="L627" class="LineNr">627 </span><span class="traceContains">+parse:   element: {y: &quot;number&quot;}</span>
+<span id="L628" class="LineNr">628 </span>
+<span id="L629" class="LineNr">629 </span><span class="Comment">//: if a container is defined again, the new fields add to the original definition</span>
+<span id="L630" class="LineNr">630 </span><span class="Delimiter">:(scenarios run)</span>
+<span id="L631" class="LineNr">631 </span><span class="Delimiter">:(scenario container_extend)</span>
+<span id="L632" class="LineNr">632 </span><span class="muData">container</span> foo [
+<span id="L633" class="LineNr">633 </span>  <span class="Normal">x</span>:num
+<span id="L634" class="LineNr">634 </span>]
+<span id="L635" class="LineNr">635 </span><span class="Comment"># add to previous definition</span>
+<span id="L636" class="LineNr">636 </span><span class="muData">container</span> foo [
+<span id="L637" class="LineNr">637 </span>  <span class="Normal">y</span>:num
+<span id="L638" class="LineNr">638 </span>]
+<span id="L639" class="LineNr">639 </span><span class="muRecipe">def</span> main [
+<span id="L640" class="LineNr">640 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L641" class="LineNr">641 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">35</span>
+<span id="L642" class="LineNr">642 </span>  <span class="Constant">3</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<span id="L643" class="LineNr">643 </span>  <span class="Constant">4</span>:num<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span>
+<span id="L644" class="LineNr">644 </span>]
+<span id="L645" class="LineNr">645 </span><span class="traceContains">+mem: storing 34 in location 3</span>
+<span id="L646" class="LineNr">646 </span><span class="traceContains">+mem: storing 35 in location 4</span>
+<span id="L647" class="LineNr">647 </span>
+<span id="L648" class="LineNr">648 </span><span class="Delimiter">:(before &quot;End Command Handlers&quot;)</span>
+<span id="L649" class="LineNr">649 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">&quot;container&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L650" class="LineNr">650 </span>  insert_container<span class="Delimiter">(</span>command<span class="Delimiter">,</span> CONTAINER<span class="Delimiter">,</span> in<span class="Delimiter">);</span>
+<span id="L651" class="LineNr">651 </span><span class="Delimiter">}</span>
+<span id="L652" class="LineNr">652 </span>
+<span id="L653" class="LineNr">653 </span><span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span>
+<span id="L654" class="LineNr">654 </span><span class="Comment">//: a call to transform_all. But we do want to detect this situation and raise</span>
+<span id="L655" class="LineNr">655 </span><span class="Comment">//: an error. This field will help us raise such errors.</span>
+<span id="L656" class="LineNr">656 </span><span class="Delimiter">:(before &quot;End type_info Fields&quot;)</span>
+<span id="L657" class="LineNr">657 </span><span class="Normal">int</span> Num_calls_to_transform_all_at_first_definition<span class="Delimiter">;</span>
+<span id="L658" class="LineNr">658 </span><span class="Delimiter">:(before &quot;End type_info Constructor&quot;)</span>
+<span id="L659" class="LineNr">659 </span>Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span>
+<span id="L660" class="LineNr">660 </span>
+<span id="L661" class="LineNr">661 </span><span class="Delimiter">:(code)</span>
+<span id="L662" class="LineNr">662 </span><span class="Normal">void</span> insert_container<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; command<span class="Delimiter">,</span> kind_of_type kind<span class="Delimiter">,</span> istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L663" class="LineNr">663 </span>  skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L664" class="LineNr">664 </span>  string name = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L665" class="LineNr">665 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<span id="L666" class="LineNr">666 </span>    assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<span id="L667" class="LineNr">667 </span>    raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (0)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L668" class="LineNr">668 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L669" class="LineNr">669 </span>  <span class="Delimiter">}</span>
+<span id="L670" class="LineNr">670 </span>  <span class="Comment">// End container Name Refinements</span>
+<span id="L671" class="LineNr">671 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- defining &quot;</span> &lt;&lt; command &lt;&lt; <span class="Constant">' '</span> &lt;&lt; name &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L672" class="LineNr">672 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span>
+<span id="L673" class="LineNr">673 </span>      || get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L674" class="LineNr">674 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<span id="L675" class="LineNr">675 </span>  <span class="Delimiter">}</span>
+<span id="L676" class="LineNr">676 </span>  trace<span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;type number: &quot;</span> &lt;&lt; get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L677" class="LineNr">677 </span>  skip_bracket<span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">&quot;'&quot;</span>+command+<span class="Constant">&quot;' must begin with '['&quot;</span><span class="Delimiter">);</span>
+<span id="L678" class="LineNr">678 </span>  type_info&amp; info = get_or_insert<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">));</span>
+<span id="L679" class="LineNr">679 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L680" class="LineNr">680 </span>    <span class="Comment">// initial definition of this container</span>
+<span id="L681" class="LineNr">681 </span>    info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition = Num_calls_to_transform_all<span class="Delimiter">;</span>
+<span id="L682" class="LineNr">682 </span>  <span class="Delimiter">}</span>
+<span id="L683" class="LineNr">683 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>Num_calls_to_transform_all_at_first_definition != Num_calls_to_transform_all<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L684" class="LineNr">684 </span>    <span class="Comment">// extension after transform_all</span>
+<span id="L685" class="LineNr">685 </span>    raise &lt;&lt; <span class="Constant">&quot;there was a call to transform_all() between the definition of container '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' and a subsequent extension. This is not supported, since any recipes that used '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' values have already been transformed and </span><span class="cSpecial">\&quot;</span><span class="Constant">frozen</span><span class="cSpecial">\&quot;</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L686" class="LineNr">686 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L687" class="LineNr">687 </span>  <span class="Delimiter">}</span>
+<span id="L688" class="LineNr">688 </span>  info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span>
+<span id="L689" class="LineNr">689 </span>  info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span>
+<span id="L690" class="LineNr">690 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L691" class="LineNr">691 </span>    skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L692" class="LineNr">692 </span>    string element = next_word<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L693" class="LineNr">693 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span>
+<span id="L694" class="LineNr">694 </span>      assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span>
+<span id="L695" class="LineNr">695 </span>      raise &lt;&lt; <span class="Constant">&quot;incomplete container definition at end of file (1)</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L696" class="LineNr">696 </span>      <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L697" class="LineNr">697 </span>    <span class="Delimiter">}</span>
+<span id="L698" class="LineNr">698 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L699" class="LineNr">699 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="cSpecial">'\n'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L700" class="LineNr">700 </span>      raise &lt;&lt; command &lt;&lt; <span class="Constant">&quot; '&quot;</span> &lt;&lt; name &lt;&lt; <span class="Constant">&quot;' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L701" class="LineNr">701 </span>      <span class="Comment">// skip rest of container declaration</span>
+<span id="L702" class="LineNr">702 </span>      <span class="Normal">while</span> <span class="Delimiter">(</span>has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L703" class="LineNr">703 </span>        skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L704" class="LineNr">704 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>next_word<span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">&quot;]&quot;</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L705" class="LineNr">705 </span>      <span class="Delimiter">}</span>
+<span id="L706" class="LineNr">706 </span>      <span class="Identifier">break</span><span class="Delimiter">;</span>
+<span id="L707" class="LineNr">707 </span>    <span class="Delimiter">}</span>
+<span id="L708" class="LineNr">708 </span>    info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>reagent<span class="Delimiter">(</span>element<span class="Delimiter">));</span>
+<span id="L709" class="LineNr">709 </span>    expand_type_abbreviations<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">);</span>  <span class="Comment">// todo: use abbreviation before declaration</span>
+<span id="L710" class="LineNr">710 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">().</span>type<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<span id="L711" class="LineNr">711 </span>    trace<span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;  element: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L712" class="LineNr">712 </span>    <span class="Comment">// End Load Container Element Definition</span>
+<span id="L713" class="LineNr">713 </span>  <span class="Delimiter">}</span>
+<span id="L714" class="LineNr">714 </span><span class="Delimiter">}</span>
+<span id="L715" class="LineNr">715 </span>
+<span id="L716" class="LineNr">716 </span><span class="Normal">void</span> replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info&amp; info<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L717" class="LineNr">717 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L718" class="LineNr">718 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L719" class="LineNr">719 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<span id="L720" class="LineNr">720 </span>    replace_unknown_types_with_unique_ordinals<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span>
+<span id="L721" class="LineNr">721 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L722" class="LineNr">722 </span>  <span class="Delimiter">}</span>
+<span id="L723" class="LineNr">723 </span>  assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<span id="L724" class="LineNr">724 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L725" class="LineNr">725 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<span id="L726" class="LineNr">726 </span>  <span class="Delimiter">}</span>
+<span id="L727" class="LineNr">727 </span>  <span class="Comment">// End insert_container Special-cases</span>
+<span id="L728" class="LineNr">728 </span>  <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>name != <span class="Constant">&quot;-&gt;&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// used in recipe types</span>
+<span id="L729" class="LineNr">729 </span>    put<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span>
+<span id="L730" class="LineNr">730 </span>    type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<span id="L731" class="LineNr">731 </span>  <span class="Delimiter">}</span>
+<span id="L732" class="LineNr">732 </span><span class="Delimiter">}</span>
+<span id="L733" class="LineNr">733 </span>
+<span id="L734" class="LineNr">734 </span><span class="Normal">void</span> skip_bracket<span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L735" class="LineNr">735 </span>  skip_whitespace_and_comments<span class="Delimiter">(</span>in<span class="Delimiter">);</span>
+<span id="L736" class="LineNr">736 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>get<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span>
+<span id="L737" class="LineNr">737 </span>    raise &lt;&lt; message &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L738" class="LineNr">738 </span><span class="Delimiter">}</span>
+<span id="L739" class="LineNr">739 </span>
+<span id="L740" class="LineNr">740 </span><span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span>
+<span id="L741" class="LineNr">741 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L742" class="LineNr">742 </span><span class="muData">container</span> foo [
+<span id="L743" class="LineNr">743 </span>  <span class="Normal">x</span>:num y:num
+<span id="L744" class="LineNr">744 </span>]
+<span id="L745" class="LineNr">745 </span><span class="traceContains">+error: container 'foo' contains multiple elements on a single line. Containers and exclusive containers must only contain elements, one to a line, no code.</span>
+<span id="L746" class="LineNr">746 </span>
+<span id="L747" class="LineNr">747 </span><span class="Comment">//: support type abbreviations in container definitions</span>
+<span id="L748" class="LineNr">748 </span>
+<span id="L749" class="LineNr">749 </span><span class="Delimiter">:(scenario type_abbreviations_in_containers)</span>
+<span id="L750" class="LineNr">750 </span><span class="muData">type</span> foo = number
+<span id="L751" class="LineNr">751 </span><span class="muData">container</span> bar [
+<span id="L752" class="LineNr">752 </span>  <span class="Normal">x</span>:foo
+<span id="L753" class="LineNr">753 </span>]
+<span id="L754" class="LineNr">754 </span><span class="muRecipe">def</span> main [
+<span id="L755" class="LineNr">755 </span>  <span class="Constant">1</span>:num<span class="Special"> &lt;- </span>copy <span class="Constant">34</span>
+<span id="L756" class="LineNr">756 </span>  <span class="Constant">2</span>:foo<span class="Special"> &lt;- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span>
+<span id="L757" class="LineNr">757 </span>]
+<span id="L758" class="LineNr">758 </span><span class="traceContains">+mem: storing 34 in location 2</span>
+<span id="L759" class="LineNr">759 </span>
+<span id="L760" class="LineNr">760 </span><span class="Delimiter">:(after &quot;Transform.push_back(expand_type_abbreviations)&quot;)</span>
+<span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>expand_type_abbreviations_in_containers<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<span id="L762" class="LineNr">762 </span><span class="Delimiter">:(code)</span>
+<span id="L763" class="LineNr">763 </span><span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span>
+<span id="L764" class="LineNr">764 </span><span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span>
+<span id="L765" class="LineNr">765 </span><span class="Normal">void</span> expand_type_abbreviations_in_containers<span class="Delimiter">(</span>unused <span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L766" class="LineNr">766 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L767" class="LineNr">767 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L768" class="LineNr">768 </span>      expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">);</span>
+<span id="L769" class="LineNr">769 </span>  <span class="Delimiter">}</span>
+<span id="L770" class="LineNr">770 </span><span class="Delimiter">}</span>
+<span id="L771" class="LineNr">771 </span>
+<span id="L772" class="LineNr">772 </span><span class="Comment">//: ensure scenarios are consistent by always starting new container</span>
+<span id="L773" class="LineNr">773 </span><span class="Comment">//: declarations at the same type number</span>
+<span id="L774" class="LineNr">774 </span><span class="Delimiter">:(before &quot;End Setup&quot;)</span>  <span class="Comment">//: for tests</span>
+<span id="L775" class="LineNr">775 </span>Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span>
+<span id="L776" class="LineNr">776 </span><span class="Delimiter">:(before &quot;End Test Run Initialization&quot;)</span>
+<span id="L777" class="LineNr">777 </span>assert<span class="Delimiter">(</span>Next_type_ordinal &lt; <span class="Constant">1000</span><span class="Delimiter">);</span>
+<span id="L778" class="LineNr">778 </span>
+<span id="L779" class="LineNr">779 </span><span class="Delimiter">:(code)</span>
+<span id="L780" class="LineNr">780 </span><span class="Normal">void</span> test_error_on_transform_all_between_container_definition_and_extension<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L781" class="LineNr">781 </span>  <span class="Comment">// define a container</span>
+<span id="L782" class="LineNr">782 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L783" class="LineNr">783 </span>      <span class="Constant">&quot;  a:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L784" class="LineNr">784 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<span id="L785" class="LineNr">785 </span>  <span class="Comment">// try to extend the container after transform</span>
+<span id="L786" class="LineNr">786 </span>  transform_all<span class="Delimiter">();</span>
+<span id="L787" class="LineNr">787 </span>  CHECK_TRACE_DOESNT_CONTAIN_ERRORS<span class="Delimiter">();</span>
+<span id="L788" class="LineNr">788 </span>  Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span>
+<span id="L789" class="LineNr">789 </span>  run<span class="Delimiter">(</span><span class="Constant">&quot;container foo [</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L790" class="LineNr">790 </span>      <span class="Constant">&quot;  b:num</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span>
+<span id="L791" class="LineNr">791 </span>      <span class="Constant">&quot;]</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span><span class="Delimiter">);</span>
+<span id="L792" class="LineNr">792 </span>  CHECK_TRACE_CONTAINS_ERRORS<span class="Delimiter">();</span>
+<span id="L793" class="LineNr">793 </span><span class="Delimiter">}</span>
+<span id="L794" class="LineNr">794 </span>
+<span id="L795" class="LineNr">795 </span><span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span>
+<span id="L796" class="LineNr">796 </span><span class="SalientComment">//:: can't find a definition at the end.</span>
+<span id="L797" class="LineNr">797 </span>
+<span id="L798" class="LineNr">798 </span><span class="Delimiter">:(scenario run_complains_on_unknown_types)</span>
+<span id="L799" class="LineNr">799 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L800" class="LineNr">800 </span><span class="muRecipe">def</span> main [
+<span id="L801" class="LineNr">801 </span>  <span class="Comment"># integer is not a type</span>
+<span id="L802" class="LineNr">802 </span>  <span class="Constant">1</span>:integer<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>
+<span id="L803" class="LineNr">803 </span>]
+<span id="L804" class="LineNr">804 </span><span class="traceContains">+error: main: unknown type integer in '1:integer &lt;- copy 0'</span>
+<span id="L805" class="LineNr">805 </span>
+<span id="L806" class="LineNr">806 </span><span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span>
+<span id="L807" class="LineNr">807 </span><span class="muRecipe">def</span> main [
+<span id="L808" class="LineNr">808 </span>  <span class="Constant">1</span>:bar<span class="Special"> &lt;- </span>copy <span class="Constant">0</span>/unsafe
+<span id="L809" class="LineNr">809 </span>]
+<span id="L810" class="LineNr">810 </span><span class="muData">container</span> bar [
+<span id="L811" class="LineNr">811 </span>  <span class="Normal">x</span>:num
+<span id="L812" class="LineNr">812 </span>]
+<span id="L813" class="LineNr">813 </span>$error: <span class="Constant">0</span>
+<span id="L814" class="LineNr">814 </span>
+<span id="L815" class="LineNr">815 </span><span class="Delimiter">:(before &quot;End Type Modifying Transforms&quot;)</span>
+<span id="L816" class="LineNr">816 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>check_or_set_invalid_types<span class="Delimiter">);</span>  <span class="Comment">// idempotent</span>
+<span id="L817" class="LineNr">817 </span>
+<span id="L818" class="LineNr">818 </span><span class="Delimiter">:(code)</span>
+<span id="L819" class="LineNr">819 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> recipe_ordinal r<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L820" class="LineNr">820 </span>  recipe&amp; caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span>
+<span id="L821" class="LineNr">821 </span>  trace<span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">&quot;transform&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;--- check for invalid types in recipe &quot;</span> &lt;&lt; caller<span class="Delimiter">.</span>name &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L822" class="LineNr">822 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> index = <span class="Constant">0</span><span class="Delimiter">;</span>  index &lt; SIZE<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>steps<span class="Delimiter">);</span>  ++index<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L823" class="LineNr">823 </span>    instruction&amp; inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span>
+<span id="L824" class="LineNr">824 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L825" class="LineNr">825 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
+<span id="L826" class="LineNr">826 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L827" class="LineNr">827 </span>      check_or_set_invalid_types<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">),</span> caller<span class="Delimiter">,</span> inst<span class="Delimiter">);</span>
+<span id="L828" class="LineNr">828 </span>  <span class="Delimiter">}</span>
+<span id="L829" class="LineNr">829 </span>  <span class="Comment">// End check_or_set_invalid_types</span>
+<span id="L830" class="LineNr">830 </span><span class="Delimiter">}</span>
+<span id="L831" class="LineNr">831 </span>
+<span id="L832" class="LineNr">832 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent&amp; r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe&amp; caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction&amp; inst<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L833" class="LineNr">833 </span>  <span class="Comment">// Begin check_or_set_invalid_types(r)</span>
+<span id="L834" class="LineNr">834 </span>  check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">&quot;'&quot;</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">&quot;'&quot;</span><span class="Delimiter">);</span>
+<span id="L835" class="LineNr">835 </span><span class="Delimiter">}</span>
+<span id="L836" class="LineNr">836 </span>
+<span id="L837" class="LineNr">837 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L838" class="LineNr">838 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L839" class="LineNr">839 </span>  <span class="Comment">// End Container Type Checks</span>
+<span id="L840" class="LineNr">840 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L841" class="LineNr">841 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<span id="L842" class="LineNr">842 </span>    check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<span id="L843" class="LineNr">843 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L844" class="LineNr">844 </span>  <span class="Delimiter">}</span>
+<span id="L845" class="LineNr">845 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L846" class="LineNr">846 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span>
+<span id="L847" class="LineNr">847 </span>    assert<span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span>
+<span id="L848" class="LineNr">848 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">))</span>
+<span id="L849" class="LineNr">849 </span>      type<span class="Delimiter">-&gt;</span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>name<span class="Delimiter">);</span>
+<span id="L850" class="LineNr">850 </span>    <span class="Normal">else</span>
+<span id="L851" class="LineNr">851 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type &quot;</span> &lt;&lt; type<span class="Delimiter">-&gt;</span>name &lt;&lt; <span class="Constant">&quot; in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L852" class="LineNr">852 </span>  <span class="Delimiter">}</span>
+<span id="L853" class="LineNr">853 </span><span class="Delimiter">}</span>
+<span id="L854" class="LineNr">854 </span>
+<span id="L855" class="LineNr">855 </span><span class="Delimiter">:(scenario container_unknown_field)</span>
+<span id="L856" class="LineNr">856 </span><span class="Special">% Hide_errors = true;</span>
+<span id="L857" class="LineNr">857 </span><span class="muData">container</span> foo [
+<span id="L858" class="LineNr">858 </span>  <span class="Normal">x</span>:num
+<span id="L859" class="LineNr">859 </span>  <span class="Normal">y</span>:bar
+<span id="L860" class="LineNr">860 </span>]
+<span id="L861" class="LineNr">861 </span><span class="traceContains">+error: foo: unknown type in y</span>
+<span id="L862" class="LineNr">862 </span>
+<span id="L863" class="LineNr">863 </span><span class="Delimiter">:(scenario read_container_with_bracket_in_comment)</span>
+<span id="L864" class="LineNr">864 </span><span class="muData">container</span> foo [
+<span id="L865" class="LineNr">865 </span>  <span class="Normal">x</span>:num
+<span id="L866" class="LineNr">866 </span>  <span class="Comment"># ']' in comment</span>
+<span id="L867" class="LineNr">867 </span>  <span class="Normal">y</span>:num
+<span id="L868" class="LineNr">868 </span>]
+<span id="L869" class="LineNr">869 </span><span class="traceContains">+parse: --- defining container foo</span>
+<span id="L870" class="LineNr">870 </span><span class="traceContains">+parse: element: {x: &quot;number&quot;}</span>
+<span id="L871" class="LineNr">871 </span><span class="traceContains">+parse: element: {y: &quot;number&quot;}</span>
+<span id="L872" class="LineNr">872 </span>
+<span id="L873" class="LineNr">873 </span><span class="Delimiter">:(scenario container_with_compound_field_type)</span>
+<span id="L874" class="LineNr">874 </span><span class="muData">container</span> foo [
+<span id="L875" class="LineNr">875 </span>  <span class="Delimiter">{</span>x: <span class="Delimiter">(</span>address array <span class="Delimiter">(</span>address array character<span class="Delimiter">))}</span>
+<span id="L876" class="LineNr">876 </span>]
+<span id="L877" class="LineNr">877 </span>$error: <span class="Constant">0</span>
+<span id="L878" class="LineNr">878 </span>
+<span id="L879" class="LineNr">879 </span><span class="Delimiter">:(before &quot;End transform_all&quot;)</span>
+<span id="L880" class="LineNr">880 </span>check_container_field_types<span class="Delimiter">();</span>
+<span id="L881" class="LineNr">881 </span>
+<span id="L882" class="LineNr">882 </span><span class="Delimiter">:(code)</span>
+<span id="L883" class="LineNr">883 </span><span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span>
+<span id="L884" class="LineNr">884 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span>map&lt;type_ordinal<span class="Delimiter">,</span> type_info&gt;::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span>  p != Type<span class="Delimiter">.</span>end<span class="Delimiter">();</span>  ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L885" class="LineNr">885 </span>    <span class="Normal">const</span> type_info&amp; info = p<span class="Delimiter">-&gt;</span>second<span class="Delimiter">;</span>
+<span id="L886" class="LineNr">886 </span>    <span class="Comment">// Check Container Field Types(info)</span>
+<span id="L887" class="LineNr">887 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; SIZE<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
+<span id="L888" class="LineNr">888 </span>      check_invalid_types<span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>type<span class="Delimiter">,</span> maybe<span class="Delimiter">(</span>info<span class="Delimiter">.</span>name<span class="Delimiter">),</span> info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name<span class="Delimiter">);</span>
+<span id="L889" class="LineNr">889 </span>  <span class="Delimiter">}</span>
+<span id="L890" class="LineNr">890 </span><span class="Delimiter">}</span>
+<span id="L891" class="LineNr">891 </span>
+<span id="L892" class="LineNr">892 </span><span class="Normal">void</span> check_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L893" class="LineNr">893 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// will throw a more precise error elsewhere</span>
+<span id="L894" class="LineNr">894 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-&gt;</span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span>
+<span id="L895" class="LineNr">895 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<span id="L896" class="LineNr">896 </span>    check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>right<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span>
+<span id="L897" class="LineNr">897 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
+<span id="L898" class="LineNr">898 </span>  <span class="Delimiter">}</span>
+<span id="L899" class="LineNr">899 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-&gt;</span>value != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>  <span class="Comment">// value 0 = compound types (layer parse_tree) or type ingredients (layer shape_shifting_container)</span>
+<span id="L900" class="LineNr">900 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> type<span class="Delimiter">-&gt;</span>value<span class="Delimiter">))</span>
+<span id="L901" class="LineNr">901 </span>      raise &lt;&lt; location_for_error_messages &lt;&lt; <span class="Constant">&quot;unknown type in &quot;</span> &lt;&lt; name_for_error_messages &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
+<span id="L902" class="LineNr">902 </span>  <span class="Delimiter">}</span>
+<span id="L903" class="LineNr">903 </span><span class="Delimiter">}</span>
 </pre>
 </body>
 </html>
#n12400'>12400 12401 12402 12403 12404 12405 12406 12407 12408 12409 12410 12411 12412 12413 12414 12415 12416 12417 12418 12419 12420 12421 12422 12423 12424 12425 12426 12427 12428 12429 12430 12431 12432 12433 12434 12435 12436 12437 12438 12439 12440 12441 12442 12443 12444 12445 12446 12447 12448 12449 12450 12451 12452 12453 12454 12455 12456 12457 12458 12459 12460 12461 12462 12463 12464 12465 12466 12467 12468 12469 12470 12471 12472 12473 12474 12475 12476 12477 12478 12479 12480 12481 12482 12483 12484 12485 12486 12487 12488 12489 12490 12491 12492 12493 12494 12495 12496 12497 12498 12499 12500 12501 12502 12503 12504 12505 12506 12507 12508 12509 12510 12511 12512 12513 12514 12515 12516 12517 12518 12519 12520 12521 12522 12523 12524 12525 12526 12527 12528 12529 12530 12531 12532 12533 12534 12535 12536 12537 12538 12539 12540 12541 12542 12543 12544 12545 12546 12547 12548 12549 12550 12551 12552 12553 12554 12555 12556 12557 12558 12559 12560 12561 12562 12563 12564 12565 12566 12567 12568 12569 12570 12571 12572 12573 12574 12575 12576 12577 12578 12579 12580 12581 12582 12583 12584 12585 12586 12587 12588 12589 12590 12591 12592 12593 12594 12595 12596 12597 12598 12599 12600 12601 12602 12603 12604 12605 12606 12607 12608 12609 12610 12611 12612 12613 12614 12615 12616 12617 12618 12619 12620 12621 12622 12623 12624 12625 12626 12627 12628 12629 12630 12631 12632 12633 12634 12635 12636 12637 12638 12639 12640 12641 12642 12643 12644 12645 12646 12647 12648 12649 12650 12651 12652 12653 12654 12655 12656 12657 12658 12659 12660 12661 12662 12663 12664 12665 12666 12667 12668 12669 12670 12671 12672 12673 12674 12675 12676 12677 12678 12679 12680 12681 12682 12683 12684 12685 12686 12687 12688 12689 12690 12691 12692 12693 12694 12695 12696 12697 12698 12699 12700 12701 12702 12703 12704 12705 12706 12707 12708 12709 12710 12711 12712 12713 12714 12715 12716 12717 12718 12719 12720 12721 12722 12723 12724 12725 12726 12727 12728 12729 12730 12731 12732 12733 12734 12735 12736 12737 12738 12739 12740 12741 12742 12743 12744 12745 12746 12747 12748 12749 12750 12751 12752 12753 12754 12755 12756 12757 12758 12759 12760 12761 12762 12763 12764 12765 12766 12767 12768 12769 12770 12771 12772 12773 12774 12775 12776 12777 12778 12779 12780 12781 12782 12783 12784 12785 12786 12787 12788 12789 12790 12791 12792 12793 12794 12795 12796 12797 12798 12799 12800 12801 12802 12803 12804 12805 12806 12807 12808 12809 12810 12811 12812 12813 12814 12815 12816 12817 12818 12819 12820 12821 12822 12823 12824 12825 12826 12827 12828 12829 12830 12831 12832 12833 12834 12835 12836 12837 12838 12839 12840 12841 12842 12843 12844 12845 12846 12847 12848 12849 12850 12851 12852 12853 12854 12855 12856 12857 12858 12859 12860 12861 12862 12863 12864 12865 12866 12867 12868 12869 12870 12871 12872 12873 12874 12875 12876 12877 12878 12879 12880 12881 12882 12883 12884 12885 12886 12887 12888 12889 12890 12891 12892 12893 12894 12895 12896 12897 12898 12899 12900 12901 12902 12903 12904 12905 12906 12907 12908 12909 12910 12911 12912 12913 12914 12915 12916 12917 12918 12919 12920 12921 12922 12923 12924 12925 12926 12927 12928 12929 12930 12931 12932 12933 12934 12935 12936 12937 12938 12939 12940 12941 12942 12943 12944 12945 12946 12947 12948 12949 12950 12951 12952 12953 12954 12955 12956 12957 12958 12959 12960 12961 12962 12963 12964 12965 12966 12967 12968 12969 12970 12971 12972 12973 12974 12975 12976 12977 12978 12979 12980 12981 12982 12983 12984 12985 12986 12987 12988 12989 12990 12991 12992 12993 12994 12995 12996 12997 12998 12999 13000 13001 13002 13003 13004 13005 13006 13007 13008 13009 13010 13011 13012 13013 13014 13015 13016 13017 13018 13019 13020 13021 13022 13023 13024 13025 13026 13027 13028 13029 13030 13031 13032 13033 13034 13035 13036 13037 13038 13039 13040 13041 13042 13043 13044 13045 13046 13047 13048 13049 13050 13051 13052 13053 13054 13055 13056 13057 13058 13059 13060 13061 13062 13063 13064 13065 13066 13067 13068 13069 13070 13071 13072 13073 13074 13075 13076 13077 13078 13079 13080 13081 13082 13083 13084 13085 13086 13087 13088 13089 13090 13091 13092 13093 13094 13095 13096 13097 13098 13099 13100 13101 13102 13103 13104 13105 13106 13107 13108 13109 13110 13111 13112 13113 13114 13115 13116 13117 13118 13119 13120 13121 13122 13123 13124 13125 13126 13127 13128 13129 13130 13131 13132 13133 13134 13135 13136 13137 13138 13139 13140 13141 13142 13143 13144 13145 13146 13147 13148 13149 13150 13151 13152 13153 13154 13155 13156 13157 13158 13159 13160 13161 13162 13163 13164 13165 13166 13167 13168 13169 13170 13171 13172 13173 13174 13175 13176 13177 13178 13179 13180 13181 13182 13183 13184 13185 13186 13187 13188 13189 13190 13191 13192 13193 13194 13195 13196 13197 13198 13199 13200 13201 13202 13203 13204 13205 13206 13207 13208 13209 13210 13211 13212 13213 13214 13215 13216 13217 13218 13219 13220 13221 13222 13223 13224 13225 13226 13227 13228 13229 13230 13231 13232 13233 13234 13235 13236 13237 13238 13239 13240 13241 13242 13243 13244 13245 13246 13247 13248 13249 13250 13251 13252 13253 13254 13255 13256 13257 13258 13259 13260 13261 13262 13263 13264 13265 13266 13267 13268 13269 13270 13271 13272 13273 13274 13275 13276 13277 13278 13279 13280 13281 13282 13283 13284 13285 13286 13287 13288 13289 13290 13291 13292 13293 13294 13295 13296 13297 13298
13299
13300
13301
13302