diff options
author | Kartik K. Agaram <vc@akkartik.com> | 2016-12-27 22:20:43 -0800 |
---|---|---|
committer | Kartik K. Agaram <vc@akkartik.com> | 2016-12-27 22:20:43 -0800 |
commit | 97eb971b7574b3f283d7111a567a301faec9912d (patch) | |
tree | 4a1f9d1987ca601efba78865c8b3d1766d23af92 /html | |
parent | df0c0babff599b0ab85f56cd50ee0b4143f12886 (diff) | |
download | mu-97eb971b7574b3f283d7111a567a301faec9912d.tar.gz |
3725
More improvements to cross-linking example programs. Include their own functions as well in the tags for each program, even as you share the core .mu files everywhere.
Diffstat (limited to 'html')
32 files changed, 1650 insertions, 1611 deletions
diff --git a/html/030container.cc.html b/html/030container.cc.html index c7144cb7..b7fea808 100644 --- a/html/030container.cc.html +++ b/html/030container.cc.html @@ -447,525 +447,524 @@ if ('onhashchange' in window) { <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><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> -<span id="L387" class="LineNr">387 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><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 < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L391" class="LineNr">391 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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 = <a href='030container.cc.html#L431'>element_type</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><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 "End Primitive Recipe Implementations")</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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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 < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src << <a href='003trace.cc.html#L195'>end</a><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 = <a href='030container.cc.html#L431'>element_type</a><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><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>src<span class="Delimiter">);</span> -<span id="L424" class="LineNr">424 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><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 <a href='030container.cc.html#L431'>element_type</a><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 >= <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">-></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">-></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& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> -<span id="L438" class="LineNr">438 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">);</span> -<span id="L439" class="LineNr">439 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value >= <a href='001help.cc.html#L138'>SIZE</a><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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L447" class="LineNr">447 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L448" class="LineNr">448 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L449" class="LineNr">449 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> -<span id="L450" class="LineNr">450 </span> <span class="Constant">15</span>:num<span class="Special"> <- </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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L457" class="LineNr">457 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L458" class="LineNr">458 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L459" class="LineNr">459 </span> <span class="Constant">14</span>:num<span class="Special"> <- </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: <a href='000organization.cc.html#L113'>main</a>: 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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L467" class="LineNr">467 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L468" class="LineNr">468 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L469" class="LineNr">469 </span> <span class="Constant">14</span>:num<span class="Special"> <- </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: <a href='000organization.cc.html#L113'>main</a>: 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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L477" class="LineNr">477 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L478" class="LineNr">478 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L479" class="LineNr">479 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> -<span id="L480" class="LineNr">480 </span> <span class="Constant">15</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </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: <a href='000organization.cc.html#L113'>main</a>: '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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L488" class="LineNr">488 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L489" class="LineNr">489 </span> <span class="Constant">13</span>:num<span class="Special"> <- </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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L498" class="LineNr">498 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L499" class="LineNr">499 </span> <span class="Constant">13</span>:num<span class="Special"> <- </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"> <- </span><a href='001help.cc.html#L218'>put</a> <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 "End Primitive Recipe Declarations")</span> -<span id="L507" class="LineNr">507 </span>PUT<span class="Delimiter">,</span> -<span id="L508" class="LineNr">508 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L509" class="LineNr">509 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put"</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span> -<span id="L510" class="LineNr">510 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</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><a href='001help.cc.html#L138'>SIZE</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L525" class="LineNr">525 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put' should have type 'offset', but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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><a href='002test.cc.html#L86'>is_integer</a><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 = <a href='002test.cc.html#L92'>to_integer</a><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 < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L539" class="LineNr">539 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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& 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& element = <a href='030container.cc.html#L431'>element_type</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << 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 << <span class="Constant">"', but got '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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 "End Primitive Recipe Implementations")</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> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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 < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></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> <a href='043space.cc.html#L76'>address</a> = 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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><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 < <a href='001help.cc.html#L138'>SIZE</a><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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << 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> << <span class="Constant">" in location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L581" class="LineNr">581 </span> <a href='001help.cc.html#L218'>put</a><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> <a href='000organization.cc.html#L113'>main</a> [ -<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"> <- </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"> <- </span><a href='001help.cc.html#L218'>put</a> <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: <a href='000organization.cc.html#L113'>main</a>: 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: "number"}</span> -<span id="L606" class="LineNr">606 </span><span class="traceContains">+parse: element: {y: "number"}</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: "number"}</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: "bar"}</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: "number"}</span> -<span id="L627" class="LineNr">627 </span><span class="traceContains">+parse: element: {y: "number"}</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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L640" class="LineNr">640 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L641" class="LineNr">641 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L642" class="LineNr">642 </span> <span class="Constant">3</span>:num<span class="Special"> <- </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"> <- </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 "End Command Handlers")</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">"container"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L650" class="LineNr">650 </span> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L174'>CONTAINER</a><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 "End type_info Fields")</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 "End type_info Constructor")</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> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span><span class="Normal">const</span> string& command<span class="Delimiter">,</span> <a href='010vm.cc.html#L172'>kind_of_type</a> kind<span class="Delimiter">,</span> istream& 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 = <a href='011load.cc.html#L166'>next_word</a><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> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << command << <span class="Constant">' '</span> << name << <a href='003trace.cc.html#L195'>end</a><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> <a href='001help.cc.html#L218'>put</a><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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L677" class="LineNr">677 </span> <a href='030container.cc.html#L734'>skip_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">"'"</span>+command+<span class="Constant">"' must begin with '['"</span><span class="Delimiter">);</span> -<span id="L678" class="LineNr">678 </span> type_info& info = <a href='001help.cc.html#L225'>get_or_insert</a><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> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"there was a call to transform_all() between the definition of container '"</span> << name << <span class="Constant">"' and a subsequent extension. This is not supported, since any recipes that used '"</span> << name << <span class="Constant">"' values have already been transformed and </span><span class="cSpecial">\"</span><span class="Constant">frozen</span><span class="cSpecial">\"</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L691" class="LineNr">691 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L692" class="LineNr">692 </span> string element = <a href='011load.cc.html#L166'>next_word</a><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> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><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">"]"</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> <a href='003trace.cc.html#L178'>raise</a> << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' 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">"</span> << <a href='003trace.cc.html#L195'>end</a><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><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L703" class="LineNr">703 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><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><a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">"]"</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> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><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> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" element: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& 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">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L719" class="LineNr">719 </span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span> -<span id="L720" class="LineNr">720 </span> <a href='030container.cc.html#L716'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></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">-></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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L725" class="LineNr">725 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></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">-></span>name != <span class="Constant">"->"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// used in recipe types</span> -<span id="L729" class="LineNr">729 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> -<span id="L730" class="LineNr">730 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></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> <a href='030container.cc.html#L734'>skip_bracket</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L735" class="LineNr">735 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><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> <a href='003trace.cc.html#L178'>raise</a> << message << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L755" class="LineNr">755 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L756" class="LineNr">756 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </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 "Transform.push_back(expand_type_abbreviations)")</span> -<span id="L761" class="LineNr">761 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030container.cc.html#L765'>expand_type_abbreviations_in_containers</a><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> <a href='030container.cc.html#L765'>expand_type_abbreviations_in_containers</a><span class="Delimiter">(</span><a href='001help.cc.html#L255'>unused</a> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> 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<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">-></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">-></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 "End Setup")</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 "End Test Run Initialization")</span> -<span id="L777" class="LineNr">777 </span>assert<span class="Delimiter">(</span>Next_type_ordinal < <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">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L783" class="LineNr">783 </span> <span class="Constant">" a:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L784" class="LineNr">784 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</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> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> -<span id="L787" class="LineNr">787 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><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">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L790" class="LineNr">790 </span> <span class="Constant">" b:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L791" class="LineNr">791 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L792" class="LineNr">792 </span> <a href='003trace.cc.html#L230'>CHECK_TRACE_CONTAINS_ERRORS</a><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> <a href='000organization.cc.html#L113'>main</a> [ -<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"> <- </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: <a href='000organization.cc.html#L113'>main</a>: unknown type integer in '1:integer <- 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> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L808" class="LineNr">808 </span> <span class="Constant">1</span>:bar<span class="Special"> <- </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 "End Type Modifying Transforms")</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> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L820" class="LineNr">820 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> -<span id="L821" class="LineNr">821 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check for invalid types in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><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 < <a href='001help.cc.html#L138'>SIZE</a><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& 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 < <a href='001help.cc.html#L138'>SIZE</a><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 < <a href='001help.cc.html#L138'>SIZE</a><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& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& 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> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"'"</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">"'"</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& location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string& 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">-></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">-></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">-></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">-></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">-></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">-></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">-></span>name<span class="Delimiter">))</span> -<span id="L849" class="LineNr">849 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></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> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type "</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><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: "number"}</span> -<span id="L871" class="LineNr">871 </span><span class="traceContains">+parse: element: {y: "number"}</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><a href='043space.cc.html#L76'>address</a> array <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> 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 "End transform_all")</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<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><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& info = p<span class="Delimiter">-></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 < <a href='001help.cc.html#L138'>SIZE</a><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> <a href='013update_operation.cc.html#L25'>maybe</a><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& location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string& 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">-></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">-></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">-></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">-></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">-></span>value<span class="Delimiter">))</span> -<span id="L901" class="LineNr">901 </span> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><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> +<span id="L385" class="LineNr">385 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L386" class="LineNr">386 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L387" class="LineNr">387 </span> <span class="Delimiter">}</span> +<span id="L388" class="LineNr">388 </span> <span class="Comment">// End update GET offset_value in Check</span> +<span id="L389" class="LineNr">389 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L390" class="LineNr">390 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L391" class="LineNr">391 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L392" class="LineNr">392 </span> <span class="Delimiter">}</span> +<span id="L393" class="LineNr">393 </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="L394" class="LineNr">394 </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="L395" class="LineNr">395 </span> <span class="Comment">// Update GET product in Check</span> +<span id="L396" class="LineNr">396 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> +<span id="L397" class="LineNr">397 </span> <span class="Normal">const</span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> +<span id="L398" class="LineNr">398 </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="L399" class="LineNr">399 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'get "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << product<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>product<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L400" class="LineNr">400 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L401" class="LineNr">401 </span> <span class="Delimiter">}</span> +<span id="L402" class="LineNr">402 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L403" class="LineNr">403 </span><span class="Delimiter">}</span> +<span id="L404" class="LineNr">404 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L405" class="LineNr">405 </span><span class="Normal">case</span> GET: <span class="Delimiter">{</span> +<span id="L406" class="LineNr">406 </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="L407" class="LineNr">407 </span> <span class="Comment">// Update GET base in Run</span> +<span id="L408" class="LineNr">408 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L409" class="LineNr">409 </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="L410" class="LineNr">410 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L411" class="LineNr">411 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L412" class="LineNr">412 </span> <span class="Delimiter">}</span> +<span id="L413" class="LineNr">413 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> +<span id="L414" class="LineNr">414 </span> <span class="Comment">// Update GET base_type in Run</span> +<span id="L415" class="LineNr">415 </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="L416" class="LineNr">416 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></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="L417" class="LineNr">417 </span> assert<span class="Delimiter">(</span>base<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>size<span class="Delimiter">);</span> +<span id="L418" class="LineNr">418 </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="L419" class="LineNr">419 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << src << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L420" class="LineNr">420 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> +<span id="L421" class="LineNr">421 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> +<span id="L422" class="LineNr">422 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>src<span class="Delimiter">);</span> +<span id="L423" class="LineNr">423 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"its type is "</span> << names_to_string<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L424" class="LineNr">424 </span> <span class="Comment">// Read element</span> +<span id="L425" class="LineNr">425 </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="L426" class="LineNr">426 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L427" class="LineNr">427 </span><span class="Delimiter">}</span> +<span id="L428" class="LineNr">428 </span> +<span id="L429" class="LineNr">429 </span><span class="Delimiter">:(code)</span> +<span id="L430" class="LineNr">430 </span><span class="Normal">const</span> reagent <a href='030container.cc.html#L430'>element_type</a><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="L431" class="LineNr">431 </span> assert<span class="Delimiter">(</span>offset_value >= <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L432" class="LineNr">432 </span> <span class="Normal">const</span> type_tree* base_type = type<span class="Delimiter">;</span> +<span id="L433" class="LineNr">433 </span> <span class="Comment">// Update base_type in element_type</span> +<span id="L434" class="LineNr">434 </span> assert<span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">));</span> +<span id="L435" class="LineNr">435 </span> assert<span class="Delimiter">(</span>!get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> +<span id="L436" class="LineNr">436 </span> <span class="Normal">const</span> type_info& info = get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">);</span> +<span id="L437" class="LineNr">437 </span> assert<span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">);</span> +<span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value >= <a href='001help.cc.html#L138'>SIZE</a><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="L439" class="LineNr">439 </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="L440" class="LineNr">440 </span> <span class="Comment">// End element_type Special-cases</span> +<span id="L441" class="LineNr">441 </span> <span class="Identifier">return</span> element<span class="Delimiter">;</span> +<span id="L442" class="LineNr">442 </span><span class="Delimiter">}</span> +<span id="L443" class="LineNr">443 </span> +<span id="L444" class="LineNr">444 </span><span class="Delimiter">:(scenario get_handles_nested_container_elements)</span> +<span id="L445" class="LineNr">445 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L446" class="LineNr">446 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L447" class="LineNr">447 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L448" class="LineNr">448 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> +<span id="L449" class="LineNr">449 </span> <span class="Constant">15</span>:num<span class="Special"> <- </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="L450" class="LineNr">450 </span>] +<span id="L451" class="LineNr">451 </span><span class="traceContains">+mem: storing 36 in location 15</span> +<span id="L452" class="LineNr">452 </span> +<span id="L453" class="LineNr">453 </span><span class="Delimiter">:(scenario get_out_of_bounds)</span> +<span id="L454" class="LineNr">454 </span><span class="Special">% Hide_errors = true;</span> +<span id="L455" class="LineNr">455 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L456" class="LineNr">456 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L457" class="LineNr">457 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L458" class="LineNr">458 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> +<span id="L459" class="LineNr">459 </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="L460" class="LineNr">460 </span>] +<span id="L461" class="LineNr">461 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset '2' for 'point-number'</span> +<span id="L462" class="LineNr">462 </span> +<span id="L463" class="LineNr">463 </span><span class="Delimiter">:(scenario get_out_of_bounds_2)</span> +<span id="L464" class="LineNr">464 </span><span class="Special">% Hide_errors = true;</span> +<span id="L465" class="LineNr">465 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L466" class="LineNr">466 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L467" class="LineNr">467 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L468" class="LineNr">468 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> +<span id="L469" class="LineNr">469 </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="L470" class="LineNr">470 </span>] +<span id="L471" class="LineNr">471 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: invalid offset '-1' for 'point-number'</span> +<span id="L472" class="LineNr">472 </span> +<span id="L473" class="LineNr">473 </span><span class="Delimiter">:(scenario get_product_type_mismatch)</span> +<span id="L474" class="LineNr">474 </span><span class="Special">% Hide_errors = true;</span> +<span id="L475" class="LineNr">475 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L476" class="LineNr">476 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L477" class="LineNr">477 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L478" class="LineNr">478 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> +<span id="L479" class="LineNr">479 </span> <span class="Constant">15</span>:<a href='043space.cc.html#L76'>address</a>:num<span class="Special"> <- </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="L480" class="LineNr">480 </span>] +<span id="L481" class="LineNr">481 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: 'get 12:point-number/raw, 1:offset' should write to number but '15' has type (address number)</span> +<span id="L482" class="LineNr">482 </span> +<span id="L483" class="LineNr">483 </span><span class="Comment">//: we might want to call 'get' without saving the results, say in a sandbox</span> +<span id="L484" class="LineNr">484 </span> +<span id="L485" class="LineNr">485 </span><span class="Delimiter">:(scenario get_without_product)</span> +<span id="L486" class="LineNr">486 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L487" class="LineNr">487 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L488" class="LineNr">488 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L489" class="LineNr">489 </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="L490" class="LineNr">490 </span>] +<span id="L491" class="LineNr">491 </span><span class="Comment"># just don't die</span> +<span id="L492" class="LineNr">492 </span> +<span id="L493" class="LineNr">493 </span><span class="SalientComment">//:: To write to elements of containers, use 'put'.</span> +<span id="L494" class="LineNr">494 </span> +<span id="L495" class="LineNr">495 </span><span class="Delimiter">:(scenario put)</span> +<span id="L496" class="LineNr">496 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L497" class="LineNr">497 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L498" class="LineNr">498 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L499" class="LineNr">499 </span> $clear-trace +<span id="L500" class="LineNr">500 </span> <span class="Constant">12</span>:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <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="L501" class="LineNr">501 </span>] +<span id="L502" class="LineNr">502 </span><span class="traceContains">+mem: storing 36 in location 13</span> +<span id="L503" class="LineNr">503 </span><span class="traceAbsent">-mem: storing 34 in location 12</span> +<span id="L504" class="LineNr">504 </span> +<span id="L505" class="LineNr">505 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +<span id="L506" class="LineNr">506 </span>PUT<span class="Delimiter">,</span> +<span id="L507" class="LineNr">507 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +<span id="L508" class="LineNr">508 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"put"</span><span class="Delimiter">,</span> PUT<span class="Delimiter">);</span> +<span id="L509" class="LineNr">509 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> +<span id="L510" class="LineNr">510 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span> +<span id="L511" class="LineNr">511 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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="L512" class="LineNr">512 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put' expects exactly 3 ingredients in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L513" class="LineNr">513 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L514" class="LineNr">514 </span> <span class="Delimiter">}</span> +<span id="L515" class="LineNr">515 </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="L516" class="LineNr">516 </span> <span class="Comment">// Update PUT base in Check</span> +<span id="L517" class="LineNr">517 </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="L518" class="LineNr">518 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L519" class="LineNr">519 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L520" class="LineNr">520 </span> <span class="Delimiter">}</span> +<span id="L521" class="LineNr">521 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> +<span id="L522" class="LineNr">522 </span> <span class="Comment">// Update PUT base_type in Check</span> +<span id="L523" class="LineNr">523 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!base_type<span class="Delimiter">-></span>atom || base_type<span class="Delimiter">-></span>value == <span class="Constant">0</span> || !contains_key<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">)</span> || get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>kind != <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L524" class="LineNr">524 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'put' should be a container, but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L525" class="LineNr">525 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L526" class="LineNr">526 </span> <span class="Delimiter">}</span> +<span id="L527" class="LineNr">527 </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="L528" class="LineNr">528 </span> <span class="Comment">// Update PUT offset in Check</span> +<span id="L529" class="LineNr">529 </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="L530" class="LineNr">530 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'put' should have type 'offset', but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L531" class="LineNr">531 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L532" class="LineNr">532 </span> <span class="Delimiter">}</span> +<span id="L533" class="LineNr">533 </span> <span class="Normal">int</span> offset_value = <span class="Constant">0</span><span class="Delimiter">;</span> +<span id="L534" class="LineNr">534 </span> <span class="Comment">//: later layers will permit non-integer offsets</span> +<span id="L535" class="LineNr">535 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L536" class="LineNr">536 </span> offset_value = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>offset<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L537" class="LineNr">537 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset_value < <span class="Constant">0</span> || offset_value >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>elements<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L538" class="LineNr">538 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"invalid offset '"</span> << offset_value << <span class="Constant">"' for '"</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></span>value<span class="Delimiter">).</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L539" class="LineNr">539 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L540" class="LineNr">540 </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="Normal">else</span> <span class="Delimiter">{</span> +<span id="L543" class="LineNr">543 </span> offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L544" class="LineNr">544 </span> <span class="Delimiter">}</span> +<span id="L545" class="LineNr">545 </span> <span class="Normal">const</span> reagent& 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="L546" class="LineNr">546 </span> <span class="Comment">//: use base.type rather than base_type because later layers will introduce compound types</span> +<span id="L547" class="LineNr">547 </span> <span class="Normal">const</span> reagent& element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset_value<span class="Delimiter">);</span> +<span id="L548" class="LineNr">548 </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="L549" class="LineNr">549 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'put "</span> << base<span class="Delimiter">.</span>original_string << <span class="Constant">", "</span> << offset<span class="Delimiter">.</span>original_string << <span class="Constant">"' should write to "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="Constant">" but '"</span> << value<span class="Delimiter">.</span>name << <span class="Constant">"' has type "</span> << names_to_string_without_quotes<span class="Delimiter">(</span>value<span class="Delimiter">.</span>type<span class="Delimiter">)</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L550" class="LineNr">550 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L551" class="LineNr">551 </span> <span class="Delimiter">}</span> +<span id="L552" class="LineNr">552 </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="L553" class="LineNr">553 </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="L554" class="LineNr">554 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"product of 'put' must be first ingredient '"</span> << 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 << <span class="Constant">"', but got '"</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>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L555" class="LineNr">555 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L556" class="LineNr">556 </span> <span class="Delimiter">}</span> +<span id="L557" class="LineNr">557 </span> <span class="Comment">// End PUT Product Checks</span> +<span id="L558" class="LineNr">558 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L559" class="LineNr">559 </span><span class="Delimiter">}</span> +<span id="L560" class="LineNr">560 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L561" class="LineNr">561 </span><span class="Normal">case</span> PUT: <span class="Delimiter">{</span> +<span id="L562" class="LineNr">562 </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="L563" class="LineNr">563 </span> <span class="Comment">// Update PUT base in Run</span> +<span id="L564" class="LineNr">564 </span> <span class="Normal">int</span> base_address = base<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L565" class="LineNr">565 </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="L566" class="LineNr">566 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"tried to access location 0 in '"</span> << to_original_string<span class="Delimiter">(</span>current_instruction<span class="Delimiter">())</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L567" class="LineNr">567 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L568" class="LineNr">568 </span> <span class="Delimiter">}</span> +<span id="L569" class="LineNr">569 </span> <span class="Normal">const</span> type_tree* base_type = base<span class="Delimiter">.</span>type<span class="Delimiter">;</span> +<span id="L570" class="LineNr">570 </span> <span class="Comment">// Update PUT base_type in Run</span> +<span id="L571" class="LineNr">571 </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="L572" class="LineNr">572 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></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="L573" class="LineNr">573 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = 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="L574" class="LineNr">574 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy to is "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L575" class="LineNr">575 </span> <span class="Comment">// optimization: directly write the element rather than updating 'product'</span> +<span id="L576" class="LineNr">576 </span> <span class="Comment">// and writing the entire container</span> +<span id="L577" class="LineNr">577 </span> <span class="Comment">// Write Memory in PUT in Run</span> +<span id="L578" class="LineNr">578 </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 < <a href='001help.cc.html#L138'>SIZE</a><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="L579" class="LineNr">579 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"mem"</span><span class="Delimiter">)</span> << <span class="Constant">"storing "</span> << 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> << <span class="Constant">" in location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L580" class="LineNr">580 </span> <a href='001help.cc.html#L218'>put</a><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="L581" class="LineNr">581 </span> <span class="Delimiter">}</span> +<span id="L582" class="LineNr">582 </span> <span class="Identifier">goto</span> finish_instruction<span class="Delimiter">;</span> +<span id="L583" class="LineNr">583 </span><span class="Delimiter">}</span> +<span id="L584" class="LineNr">584 </span> +<span id="L585" class="LineNr">585 </span><span class="Delimiter">:(scenario put_product_error)</span> +<span id="L586" class="LineNr">586 </span><span class="Special">% Hide_errors = true;</span> +<span id="L587" class="LineNr">587 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L588" class="LineNr">588 </span> local-scope +<span id="L589" class="LineNr">589 </span> load-ingredients +<span id="L590" class="LineNr">590 </span> <span class="Constant">1</span>:point<span class="Special"> <- </span>merge <span class="Constant">34</span><span class="Delimiter">,</span> <span class="Constant">35</span> +<span id="L591" class="LineNr">591 </span> <span class="Constant">3</span>:point<span class="Special"> <- </span><a href='001help.cc.html#L218'>put</a> <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="L592" class="LineNr">592 </span>] +<span id="L593" class="LineNr">593 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: product of 'put' must be first ingredient '1:point', but got '3:point'</span> +<span id="L594" class="LineNr">594 </span> +<span id="L595" class="LineNr">595 </span><span class="SalientComment">//:: Allow containers to be defined in Mu code.</span> +<span id="L596" class="LineNr">596 </span> +<span id="L597" class="LineNr">597 </span><span class="Delimiter">:(scenarios load)</span> +<span id="L598" class="LineNr">598 </span><span class="Delimiter">:(scenario container)</span> +<span id="L599" class="LineNr">599 </span><span class="muData">container</span> foo [ +<span id="L600" class="LineNr">600 </span> <span class="Normal">x</span>:num +<span id="L601" class="LineNr">601 </span> <span class="Normal">y</span>:num +<span id="L602" class="LineNr">602 </span>] +<span id="L603" class="LineNr">603 </span><span class="traceContains">+parse: --- defining container foo</span> +<span id="L604" class="LineNr">604 </span><span class="traceContains">+parse: element: {x: "number"}</span> +<span id="L605" class="LineNr">605 </span><span class="traceContains">+parse: element: {y: "number"}</span> +<span id="L606" class="LineNr">606 </span> +<span id="L607" class="LineNr">607 </span><span class="Delimiter">:(scenario container_use_before_definition)</span> +<span id="L608" class="LineNr">608 </span><span class="muData">container</span> foo [ +<span id="L609" class="LineNr">609 </span> <span class="Normal">x</span>:num +<span id="L610" class="LineNr">610 </span> <span class="Normal">y</span>:bar +<span id="L611" class="LineNr">611 </span>] +<span id="L612" class="LineNr">612 </span><span class="muData">container</span> bar [ +<span id="L613" class="LineNr">613 </span> <span class="Normal">x</span>:num +<span id="L614" class="LineNr">614 </span> <span class="Normal">y</span>:num +<span id="L615" class="LineNr">615 </span>] +<span id="L616" class="LineNr">616 </span><span class="traceContains">+parse: --- defining container foo</span> +<span id="L617" class="LineNr">617 </span><span class="traceContains">+parse: type number: 1000</span> +<span id="L618" class="LineNr">618 </span><span class="traceContains">+parse: element: {x: "number"}</span> +<span id="L619" class="LineNr">619 </span><span class="Comment"># todo: brittle</span> +<span id="L620" class="LineNr">620 </span><span class="Comment"># type bar is unknown at this point, but we assign it a number</span> +<span id="L621" class="LineNr">621 </span><span class="traceContains">+parse: element: {y: "bar"}</span> +<span id="L622" class="LineNr">622 </span><span class="Comment"># later type bar geon</span> +<span id="L623" class="LineNr">623 </span><span class="traceContains">+parse: --- defining container bar</span> +<span id="L624" class="LineNr">624 </span><span class="traceContains">+parse: type number: 1001</span> +<span id="L625" class="LineNr">625 </span><span class="traceContains">+parse: element: {x: "number"}</span> +<span id="L626" class="LineNr">626 </span><span class="traceContains">+parse: element: {y: "number"}</span> +<span id="L627" class="LineNr">627 </span> +<span id="L628" class="LineNr">628 </span><span class="Comment">//: if a container is defined again, the new fields add to the original definition</span> +<span id="L629" class="LineNr">629 </span><span class="Delimiter">:(scenarios run)</span> +<span id="L630" class="LineNr">630 </span><span class="Delimiter">:(scenario container_extend)</span> +<span id="L631" class="LineNr">631 </span><span class="muData">container</span> foo [ +<span id="L632" class="LineNr">632 </span> <span class="Normal">x</span>:num +<span id="L633" class="LineNr">633 </span>] +<span id="L634" class="LineNr">634 </span><span class="Comment"># add to previous definition</span> +<span id="L635" class="LineNr">635 </span><span class="muData">container</span> foo [ +<span id="L636" class="LineNr">636 </span> <span class="Normal">y</span>:num +<span id="L637" class="LineNr">637 </span>] +<span id="L638" class="LineNr">638 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L639" class="LineNr">639 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L640" class="LineNr">640 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L641" class="LineNr">641 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">0:offset</span> +<span id="L642" class="LineNr">642 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>get <span class="Constant">1</span>:foo<span class="Delimiter">,</span> <span class="Constant">1:offset</span> +<span id="L643" class="LineNr">643 </span>] +<span id="L644" class="LineNr">644 </span><span class="traceContains">+mem: storing 34 in location 3</span> +<span id="L645" class="LineNr">645 </span><span class="traceContains">+mem: storing 35 in location 4</span> +<span id="L646" class="LineNr">646 </span> +<span id="L647" class="LineNr">647 </span><span class="Delimiter">:(before "End Command Handlers")</span> +<span id="L648" class="LineNr">648 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"container"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L649" class="LineNr">649 </span> <a href='030container.cc.html#L661'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L650" class="LineNr">650 </span><span class="Delimiter">}</span> +<span id="L651" class="LineNr">651 </span> +<span id="L652" class="LineNr">652 </span><span class="Comment">//: Even though we allow containers to be extended, we don't allow this after</span> +<span id="L653" class="LineNr">653 </span><span class="Comment">//: a call to transform_all. But we do want to detect this situation and raise</span> +<span id="L654" class="LineNr">654 </span><span class="Comment">//: an error. This field will help us raise such errors.</span> +<span id="L655" class="LineNr">655 </span><span class="Delimiter">:(before "End type_info Fields")</span> +<span id="L656" class="LineNr">656 </span><span class="Normal">int</span> Num_calls_to_transform_all_at_first_definition<span class="Delimiter">;</span> +<span id="L657" class="LineNr">657 </span><span class="Delimiter">:(before "End type_info Constructor")</span> +<span id="L658" class="LineNr">658 </span>Num_calls_to_transform_all_at_first_definition = -<span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L659" class="LineNr">659 </span> +<span id="L660" class="LineNr">660 </span><span class="Delimiter">:(code)</span> +<span id="L661" class="LineNr">661 </span><span class="Normal">void</span> <a href='030container.cc.html#L661'>insert_container</a><span class="Delimiter">(</span><span class="Normal">const</span> string& command<span class="Delimiter">,</span> <a href='010vm.cc.html#L172'>kind_of_type</a> kind<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L662" class="LineNr">662 </span> skip_whitespace_but_not_newline<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L663" class="LineNr">663 </span> string name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L664" class="LineNr">664 </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="L665" class="LineNr">665 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L666" class="LineNr">666 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L667" class="LineNr">667 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L668" class="LineNr">668 </span> <span class="Delimiter">}</span> +<span id="L669" class="LineNr">669 </span> <span class="Comment">// End container Name Refinements</span> +<span id="L670" class="LineNr">670 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"--- defining "</span> << command << <span class="Constant">' '</span> << name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L671" class="LineNr">671 </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="L672" class="LineNr">672 </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="L673" class="LineNr">673 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L674" class="LineNr">674 </span> <span class="Delimiter">}</span> +<span id="L675" class="LineNr">675 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">"type number: "</span> << get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> name<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L676" class="LineNr">676 </span> <a href='030container.cc.html#L733'>skip_bracket</a><span class="Delimiter">(</span>in<span class="Delimiter">,</span> <span class="Constant">"'"</span>+command+<span class="Constant">"' must begin with '['"</span><span class="Delimiter">);</span> +<span id="L677" class="LineNr">677 </span> type_info& info = <a href='001help.cc.html#L225'>get_or_insert</a><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="L678" class="LineNr">678 </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="L679" class="LineNr">679 </span> <span class="Comment">// initial definition of this container</span> +<span id="L680" class="LineNr">680 </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="L681" class="LineNr">681 </span> <span class="Delimiter">}</span> +<span id="L682" class="LineNr">682 </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="L683" class="LineNr">683 </span> <span class="Comment">// extension after transform_all</span> +<span id="L684" class="LineNr">684 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"there was a call to transform_all() between the definition of container '"</span> << name << <span class="Constant">"' and a subsequent extension. This is not supported, since any recipes that used '"</span> << name << <span class="Constant">"' values have already been transformed and </span><span class="cSpecial">\"</span><span class="Constant">frozen</span><span class="cSpecial">\"</span><span class="Constant">.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L685" class="LineNr">685 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L686" class="LineNr">686 </span> <span class="Delimiter">}</span> +<span id="L687" class="LineNr">687 </span> info<span class="Delimiter">.</span>name = name<span class="Delimiter">;</span> +<span id="L688" class="LineNr">688 </span> info<span class="Delimiter">.</span>kind = kind<span class="Delimiter">;</span> +<span id="L689" class="LineNr">689 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L690" class="LineNr">690 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L691" class="LineNr">691 </span> string element = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L692" class="LineNr">692 </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="L693" class="LineNr">693 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L694" class="LineNr">694 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete container definition at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L695" class="LineNr">695 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L696" class="LineNr">696 </span> <span class="Delimiter">}</span> +<span id="L697" class="LineNr">697 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>element == <span class="Constant">"]"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L698" class="LineNr">698 </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="L699" class="LineNr">699 </span> <a href='003trace.cc.html#L178'>raise</a> << command << <span class="Constant">" '"</span> << name << <span class="Constant">"' 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">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L700" class="LineNr">700 </span> <span class="Comment">// skip rest of container declaration</span> +<span id="L701" class="LineNr">701 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L235'>has_data</a><span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L702" class="LineNr">702 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L703" class="LineNr">703 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">)</span> == <span class="Constant">"]"</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L704" class="LineNr">704 </span> <span class="Delimiter">}</span> +<span id="L705" class="LineNr">705 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L706" class="LineNr">706 </span> <span class="Delimiter">}</span> +<span id="L707" class="LineNr">707 </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="L708" class="LineNr">708 </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="L709" class="LineNr">709 </span> <a href='030container.cc.html#L715'>replace_unknown_types_with_unique_ordinals</a><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="L710" class="LineNr">710 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"parse"</span><span class="Delimiter">)</span> << <span class="Constant">" element: "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">.</span>back<span class="Delimiter">())</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L711" class="LineNr">711 </span> <span class="Comment">// End Load Container Element Definition</span> +<span id="L712" class="LineNr">712 </span> <span class="Delimiter">}</span> +<span id="L713" class="LineNr">713 </span><span class="Delimiter">}</span> +<span id="L714" class="LineNr">714 </span> +<span id="L715" class="LineNr">715 </span><span class="Normal">void</span> <a href='030container.cc.html#L715'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type_tree* type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& info<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L716" class="LineNr">716 </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="L717" class="LineNr">717 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L718" class="LineNr">718 </span> <a href='030container.cc.html#L715'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> info<span class="Delimiter">);</span> +<span id="L719" class="LineNr">719 </span> <a href='030container.cc.html#L715'>replace_unknown_types_with_unique_ordinals</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<span class="Delimiter">,</span> info<span class="Delimiter">);</span> +<span id="L720" class="LineNr">720 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L721" class="LineNr">721 </span> <span class="Delimiter">}</span> +<span id="L722" class="LineNr">722 </span> assert<span class="Delimiter">(</span>!type<span class="Delimiter">-></span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> +<span id="L723" class="LineNr">723 </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">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L724" class="LineNr">724 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> +<span id="L725" class="LineNr">725 </span> <span class="Delimiter">}</span> +<span id="L726" class="LineNr">726 </span> <span class="Comment">// End insert_container Special-cases</span> +<span id="L727" class="LineNr">727 </span> <span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>name != <span class="Constant">"->"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span class="Comment">// used in recipe types</span> +<span id="L728" class="LineNr">728 </span> <a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> Next_type_ordinal++<span class="Delimiter">);</span> +<span id="L729" class="LineNr">729 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> +<span id="L730" class="LineNr">730 </span> <span class="Delimiter">}</span> +<span id="L731" class="LineNr">731 </span><span class="Delimiter">}</span> +<span id="L732" class="LineNr">732 </span> +<span id="L733" class="LineNr">733 </span><span class="Normal">void</span> <a href='030container.cc.html#L733'>skip_bracket</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">,</span> string message<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L734" class="LineNr">734 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L735" class="LineNr">735 </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="L736" class="LineNr">736 </span> <a href='003trace.cc.html#L178'>raise</a> << message << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L737" class="LineNr">737 </span><span class="Delimiter">}</span> +<span id="L738" class="LineNr">738 </span> +<span id="L739" class="LineNr">739 </span><span class="Delimiter">:(scenario multi_word_line_in_container_declaration)</span> +<span id="L740" class="LineNr">740 </span><span class="Special">% Hide_errors = true;</span> +<span id="L741" class="LineNr">741 </span><span class="muData">container</span> foo [ +<span id="L742" class="LineNr">742 </span> <span class="Normal">x</span>:num y:num +<span id="L743" class="LineNr">743 </span>] +<span id="L744" class="LineNr">744 </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="L745" class="LineNr">745 </span> +<span id="L746" class="LineNr">746 </span><span class="Comment">//: support type abbreviations in container definitions</span> +<span id="L747" class="LineNr">747 </span> +<span id="L748" class="LineNr">748 </span><span class="Delimiter">:(scenario type_abbreviations_in_containers)</span> +<span id="L749" class="LineNr">749 </span><span class="muData">type</span> foo = number +<span id="L750" class="LineNr">750 </span><span class="muData">container</span> bar [ +<span id="L751" class="LineNr">751 </span> <span class="Normal">x</span>:foo +<span id="L752" class="LineNr">752 </span>] +<span id="L753" class="LineNr">753 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L754" class="LineNr">754 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> +<span id="L755" class="LineNr">755 </span> <span class="Constant">2</span>:foo<span class="Special"> <- </span>get <span class="Constant">1</span>:bar/unsafe<span class="Delimiter">,</span> <span class="Constant">0:offset</span> +<span id="L756" class="LineNr">756 </span>] +<span id="L757" class="LineNr">757 </span><span class="traceContains">+mem: storing 34 in location 2</span> +<span id="L758" class="LineNr">758 </span> +<span id="L759" class="LineNr">759 </span><span class="Delimiter">:(after "Transform.push_back(expand_type_abbreviations)")</span> +<span id="L760" class="LineNr">760 </span>Transform<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='030container.cc.html#L764'>expand_type_abbreviations_in_containers</a><span class="Delimiter">);</span> <span class="Comment">// idempotent</span> +<span id="L761" class="LineNr">761 </span><span class="Delimiter">:(code)</span> +<span id="L762" class="LineNr">762 </span><span class="Comment">// extremely inefficient; we process all types over and over again, once for every single recipe</span> +<span id="L763" class="LineNr">763 </span><span class="Comment">// but it doesn't seem to cause any noticeable slowdown</span> +<span id="L764" class="LineNr">764 </span><span class="Normal">void</span> <a href='030container.cc.html#L764'>expand_type_abbreviations_in_containers</a><span class="Delimiter">(</span><a href='001help.cc.html#L255'>unused</a> <span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L765" class="LineNr">765 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L766" class="LineNr">766 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>second<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L767" class="LineNr">767 </span> expand_type_abbreviations<span class="Delimiter">(</span>p<span class="Delimiter">-></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="L768" class="LineNr">768 </span> <span class="Delimiter">}</span> +<span id="L769" class="LineNr">769 </span><span class="Delimiter">}</span> +<span id="L770" class="LineNr">770 </span> +<span id="L771" class="LineNr">771 </span><span class="Comment">//: ensure scenarios are consistent by always starting new container</span> +<span id="L772" class="LineNr">772 </span><span class="Comment">//: declarations at the same type number</span> +<span id="L773" class="LineNr">773 </span><span class="Delimiter">:(before "End Setup")</span> <span class="Comment">//: for tests</span> +<span id="L774" class="LineNr">774 </span>Next_type_ordinal = <span class="Constant">1000</span><span class="Delimiter">;</span> +<span id="L775" class="LineNr">775 </span><span class="Delimiter">:(before "End Test Run Initialization")</span> +<span id="L776" class="LineNr">776 </span>assert<span class="Delimiter">(</span>Next_type_ordinal < <span class="Constant">1000</span><span class="Delimiter">);</span> +<span id="L777" class="LineNr">777 </span> +<span id="L778" class="LineNr">778 </span><span class="Delimiter">:(code)</span> +<span id="L779" class="LineNr">779 </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="L780" class="LineNr">780 </span> <span class="Comment">// define a container</span> +<span id="L781" class="LineNr">781 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L782" class="LineNr">782 </span> <span class="Constant">" a:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L783" class="LineNr">783 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L784" class="LineNr">784 </span> <span class="Comment">// try to extend the container after transform</span> +<span id="L785" class="LineNr">785 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L786" class="LineNr">786 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> +<span id="L787" class="LineNr">787 </span> Hide_errors = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L788" class="LineNr">788 </span> run<span class="Delimiter">(</span><span class="Constant">"container foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L789" class="LineNr">789 </span> <span class="Constant">" b:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L790" class="LineNr">790 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L791" class="LineNr">791 </span> <a href='003trace.cc.html#L230'>CHECK_TRACE_CONTAINS_ERRORS</a><span class="Delimiter">();</span> +<span id="L792" class="LineNr">792 </span><span class="Delimiter">}</span> +<span id="L793" class="LineNr">793 </span> +<span id="L794" class="LineNr">794 </span><span class="SalientComment">//:: Allow container definitions anywhere in the codebase, but complain if you</span> +<span id="L795" class="LineNr">795 </span><span class="SalientComment">//:: can't find a definition at the end.</span> +<span id="L796" class="LineNr">796 </span> +<span id="L797" class="LineNr">797 </span><span class="Delimiter">:(scenario run_complains_on_unknown_types)</span> +<span id="L798" class="LineNr">798 </span><span class="Special">% Hide_errors = true;</span> +<span id="L799" class="LineNr">799 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L800" class="LineNr">800 </span> <span class="Comment"># integer is not a type</span> +<span id="L801" class="LineNr">801 </span> <span class="Constant">1</span>:integer<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L802" class="LineNr">802 </span>] +<span id="L803" class="LineNr">803 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: unknown type integer in '1:integer <- copy 0'</span> +<span id="L804" class="LineNr">804 </span> +<span id="L805" class="LineNr">805 </span><span class="Delimiter">:(scenario run_allows_type_definition_after_use)</span> +<span id="L806" class="LineNr">806 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L807" class="LineNr">807 </span> <span class="Constant">1</span>:bar<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe +<span id="L808" class="LineNr">808 </span>] +<span id="L809" class="LineNr">809 </span><span class="muData">container</span> bar [ +<span id="L810" class="LineNr">810 </span> <span class="Normal">x</span>:num +<span id="L811" class="LineNr">811 </span>] +<span id="L812" class="LineNr">812 </span>$error: <span class="Constant">0</span> +<span id="L813" class="LineNr">813 </span> +<span id="L814" class="LineNr">814 </span><span class="Delimiter">:(before "End Type Modifying Transforms")</span> +<span id="L815" class="LineNr">815 </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="L816" class="LineNr">816 </span> +<span id="L817" class="LineNr">817 </span><span class="Delimiter">:(code)</span> +<span id="L818" class="LineNr">818 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L819" class="LineNr">819 </span> recipe& caller = get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">);</span> +<span id="L820" class="LineNr">820 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9991</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"--- check for invalid types in <a href='010vm.cc.html#L19'>recipe</a> "</span> << caller<span class="Delimiter">.</span>name << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L821" class="LineNr">821 </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 < <a href='001help.cc.html#L138'>SIZE</a><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="L822" class="LineNr">822 </span> instruction& inst = caller<span class="Delimiter">.</span>steps<span class="Delimiter">.</span>at<span class="Delimiter">(</span>index<span class="Delimiter">);</span> +<span id="L823" class="LineNr">823 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L824" class="LineNr">824 </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="L825" class="LineNr">825 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>products<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L826" class="LineNr">826 </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="L827" class="LineNr">827 </span> <span class="Delimiter">}</span> +<span id="L828" class="LineNr">828 </span> <span class="Comment">// End check_or_set_invalid_types</span> +<span id="L829" class="LineNr">829 </span><span class="Delimiter">}</span> +<span id="L830" class="LineNr">830 </span> +<span id="L831" class="LineNr">831 </span><span class="Normal">void</span> check_or_set_invalid_types<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">,</span> <span class="Normal">const</span> instruction& inst<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L832" class="LineNr">832 </span> <span class="Comment">// Begin check_or_set_invalid_types(r)</span> +<span id="L833" class="LineNr">833 </span> check_or_set_invalid_types<span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">),</span> <span class="Constant">"'"</span>+inst<span class="Delimiter">.</span>original_string+<span class="Constant">"'"</span><span class="Delimiter">);</span> +<span id="L834" class="LineNr">834 </span><span class="Delimiter">}</span> +<span id="L835" class="LineNr">835 </span> +<span id="L836" class="LineNr">836 </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& location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string& name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L837" class="LineNr">837 </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="L838" class="LineNr">838 </span> <span class="Comment">// End Container Type Checks</span> +<span id="L839" class="LineNr">839 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L840" class="LineNr">840 </span> check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span> +<span id="L841" class="LineNr">841 </span> check_or_set_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<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> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L843" class="LineNr">843 </span> <span class="Delimiter">}</span> +<span id="L844" class="LineNr">844 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></span>value == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L845" class="LineNr">845 </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">-></span>value<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L846" class="LineNr">846 </span> assert<span class="Delimiter">(</span>!type<span class="Delimiter">-></span>name<span class="Delimiter">.</span>empty<span class="Delimiter">());</span> +<span id="L847" class="LineNr">847 </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">-></span>name<span class="Delimiter">))</span> +<span id="L848" class="LineNr">848 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>Type_ordinal<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> +<span id="L849" class="LineNr">849 </span> <span class="Normal">else</span> +<span id="L850" class="LineNr">850 </span> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type "</span> << type<span class="Delimiter">-></span>name << <span class="Constant">" in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L851" class="LineNr">851 </span> <span class="Delimiter">}</span> +<span id="L852" class="LineNr">852 </span><span class="Delimiter">}</span> +<span id="L853" class="LineNr">853 </span> +<span id="L854" class="LineNr">854 </span><span class="Delimiter">:(scenario container_unknown_field)</span> +<span id="L855" class="LineNr">855 </span><span class="Special">% Hide_errors = true;</span> +<span id="L856" class="LineNr">856 </span><span class="muData">container</span> foo [ +<span id="L857" class="LineNr">857 </span> <span class="Normal">x</span>:num +<span id="L858" class="LineNr">858 </span> <span class="Normal">y</span>:bar +<span id="L859" class="LineNr">859 </span>] +<span id="L860" class="LineNr">860 </span><span class="traceContains">+error: foo: unknown type in y</span> +<span id="L861" class="LineNr">861 </span> +<span id="L862" class="LineNr">862 </span><span class="Delimiter">:(scenario read_container_with_bracket_in_comment)</span> +<span id="L863" class="LineNr">863 </span><span class="muData">container</span> foo [ +<span id="L864" class="LineNr">864 </span> <span class="Normal">x</span>:num +<span id="L865" class="LineNr">865 </span> <span class="Comment"># ']' in comment</span> +<span id="L866" class="LineNr">866 </span> <span class="Normal">y</span>:num +<span id="L867" class="LineNr">867 </span>] +<span id="L868" class="LineNr">868 </span><span class="traceContains">+parse: --- defining container foo</span> +<span id="L869" class="LineNr">869 </span><span class="traceContains">+parse: element: {x: "number"}</span> +<span id="L870" class="LineNr">870 </span><span class="traceContains">+parse: element: {y: "number"}</span> +<span id="L871" class="LineNr">871 </span> +<span id="L872" class="LineNr">872 </span><span class="Delimiter">:(scenario container_with_compound_field_type)</span> +<span id="L873" class="LineNr">873 </span><span class="muData">container</span> foo [ +<span id="L874" class="LineNr">874 </span> <span class="Delimiter">{</span>x: <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array <span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a> array character<span class="Delimiter">))}</span> +<span id="L875" class="LineNr">875 </span>] +<span id="L876" class="LineNr">876 </span>$error: <span class="Constant">0</span> +<span id="L877" class="LineNr">877 </span> +<span id="L878" class="LineNr">878 </span><span class="Delimiter">:(before "End transform_all")</span> +<span id="L879" class="LineNr">879 </span>check_container_field_types<span class="Delimiter">();</span> +<span id="L880" class="LineNr">880 </span> +<span id="L881" class="LineNr">881 </span><span class="Delimiter">:(code)</span> +<span id="L882" class="LineNr">882 </span><span class="Normal">void</span> check_container_field_types<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L883" class="LineNr">883 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<type_ordinal<span class="Delimiter">,</span> type_info>::iterator p = Type<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Type<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L884" class="LineNr">884 </span> <span class="Normal">const</span> type_info& info = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> +<span id="L885" class="LineNr">885 </span> <span class="Comment">// Check Container Field Types(info)</span> +<span id="L886" class="LineNr">886 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> +<span id="L887" class="LineNr">887 </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> <a href='013update_operation.cc.html#L25'>maybe</a><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="L888" class="LineNr">888 </span> <span class="Delimiter">}</span> +<span id="L889" class="LineNr">889 </span><span class="Delimiter">}</span> +<span id="L890" class="LineNr">890 </span> +<span id="L891" class="LineNr">891 </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& location_for_error_messages<span class="Delimiter">,</span> <span class="Normal">const</span> string& name_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L892" class="LineNr">892 </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="L893" class="LineNr">893 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L894" class="LineNr">894 </span> check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-></span>left<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">,</span> name_for_error_messages<span class="Delimiter">);</span> +<span id="L895" class="LineNr">895 </span> check_invalid_types<span class="Delimiter">(</span>type<span class="Delimiter">-></span>right<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> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L897" class="LineNr">897 </span> <span class="Delimiter">}</span> +<span id="L898" class="LineNr">898 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>type<span class="Delimiter">-></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="L899" class="LineNr">899 </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">-></span>value<span class="Delimiter">))</span> +<span id="L900" class="LineNr">900 </span> <a href='003trace.cc.html#L178'>raise</a> << location_for_error_messages << <span class="Constant">"unknown type in "</span> << name_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L901" class="LineNr">901 </span> <span class="Delimiter">}</span> +<span id="L902" class="LineNr">902 </span><span class="Delimiter">}</span> </pre> </body> </html> diff --git a/html/031merge.cc.html b/html/031merge.cc.html index f6b3bb4e..158f4f93 100644 --- a/html/031merge.cc.html +++ b/html/031merge.cc.html @@ -223,7 +223,7 @@ if ('onhashchange' in window) { <span id="L160" class="LineNr">160 </span> <span class="Comment">// degenerate case: merge with the same type always succeeds</span> <span id="L161" class="LineNr">161 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index == <span class="Constant">0</span> && <a href='021check_instruction.cc.html#L100'>types_coercible</a><span class="Delimiter">(</span>container<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span id="L162" class="LineNr">162 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> reagent& expected_ingredient = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>container<span class="Delimiter">.</span>type<span class="Delimiter">,</span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">);</span> +<span id="L163" class="LineNr">163 </span> <span class="Normal">const</span> reagent& expected_ingredient = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>container<span class="Delimiter">.</span>type<span class="Delimiter">,</span> state<span class="Delimiter">.</span>data<span class="Delimiter">.</span>top<span class="Delimiter">().</span>container_element_index<span class="Delimiter">);</span> <span id="L164" class="LineNr">164 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>container<span class="Delimiter">)</span> << <span class="Constant">" || "</span> << <a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">)</span> << <span class="Constant">" vs ingredient "</span> << ingredient_index << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L165" class="LineNr">165 </span> <span class="Comment">// if the current element is the ingredient we expect, move on to the next element/ingredient</span> <span id="L166" class="LineNr">166 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='021check_instruction.cc.html#L100'>types_coercible</a><span class="Delimiter">(</span>expected_ingredient<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>ingredient_index<span class="Delimiter">)))</span> <span class="Delimiter">{</span> diff --git a/html/032array.cc.html b/html/032array.cc.html index fe40d71e..c3019efb 100644 --- a/html/032array.cc.html +++ b/html/032array.cc.html @@ -202,7 +202,7 @@ if ('onhashchange' in window) { <span id="L139" class="LineNr">139 </span>] <span id="L140" class="LineNr">140 </span>$error: <span class="Constant">0</span> <span id="L141" class="LineNr">141 </span> -<span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L662'>insert_container</a> Special-cases")</span> +<span id="L142" class="LineNr">142 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L661'>insert_container</a> Special-cases")</span> <span id="L143" class="LineNr">143 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='002test.cc.html#L86'>is_integer</a><span class="Delimiter">(</span>type<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span class="Comment">// sometimes types will contain non-type tags, like numbers for the size of an array</span> <span id="L144" class="LineNr">144 </span> type<span class="Delimiter">-></span>value = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L145" class="LineNr">145 </span><span class="Delimiter">}</span> diff --git a/html/033exclusive_container.cc.html b/html/033exclusive_container.cc.html index af274e12..9148aa53 100644 --- a/html/033exclusive_container.cc.html +++ b/html/033exclusive_container.cc.html @@ -292,7 +292,7 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span> <span id="L230" class="LineNr">230 </span><span class="Delimiter">:(before "End Command Handlers")</span> <span id="L231" class="LineNr">231 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"exclusive-container"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L232" class="LineNr">232 </span> <a href='030container.cc.html#L662'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L232" class="LineNr">232 </span> <a href='030container.cc.html#L661'>insert_container</a><span class="Delimiter">(</span>command<span class="Delimiter">,</span> <a href='010vm.cc.html#L175'>EXCLUSIVE_CONTAINER</a><span class="Delimiter">,</span> in<span class="Delimiter">);</span> <span id="L233" class="LineNr">233 </span><span class="Delimiter">}</span> <span id="L234" class="LineNr">234 </span> <span id="L235" class="LineNr">235 </span><span class="Comment">//: arrays are disallowed inside exclusive containers unless their length is</span> diff --git a/html/036refcount.cc.html b/html/036refcount.cc.html index f1dfae7d..714ef77b 100644 --- a/html/036refcount.cc.html +++ b/html/036refcount.cc.html @@ -200,7 +200,7 @@ if ('onhashchange' in window) { <span id="L137" class="LineNr"> 137 </span><span class="traceContains">+mem: incrementing refcount of 1000: 1 -> 2</span> <span id="L138" class="LineNr"> 138 </span> <span id="L139" class="LineNr"> 139 </span><span class="Delimiter">:(after "Write Memory in PUT in Run")</span> -<span id="L140" class="LineNr"> 140 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> +<span id="L140" class="LineNr"> 140 </span>reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> offset<span class="Delimiter">);</span> <span id="L141" class="LineNr"> 141 </span>assert<span class="Delimiter">(</span>!has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">"lookup"</span><span class="Delimiter">));</span> <span id="L142" class="LineNr"> 142 </span>element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> <span id="L143" class="LineNr"> 143 </span><a href='036refcount.cc.html#L29'>update_any_refcounts</a><span class="Delimiter">(</span>element<span class="Delimiter">,</span> ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">2</span><span class="Delimiter">));</span> @@ -423,7 +423,7 @@ if ('onhashchange' in window) { <span id="L360" class="LineNr"> 360 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>info<span class="Delimiter">.</span>kind == <a href='010vm.cc.html#L174'>CONTAINER</a><span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L361" class="LineNr"> 361 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr_index = <span class="Constant">0</span><span class="Delimiter">,</span> curr_offset = base_offset<span class="Delimiter">;</span> curr_index < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++curr_index<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L362" class="LineNr"> 362 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"checking container "</span> << base_type<span class="Delimiter">-></span>name << <span class="Constant">", element "</span> << curr_index << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L363" class="LineNr"> 363 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> curr_index<span class="Delimiter">);</span> <span class="Comment">// not base_type</span> +<span id="L363" class="LineNr"> 363 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>type<span class="Delimiter">,</span> curr_index<span class="Delimiter">);</span> <span class="Comment">// not base_type</span> <span id="L364" class="LineNr"> 364 </span> <span class="Comment">// Compute Container Address Offset(element)</span> <span id="L365" class="LineNr"> 365 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_address<span class="Delimiter">(</span>element<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L366" class="LineNr"> 366 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"transform"</span><span class="Delimiter">)</span> << <span class="Constant">"address at offset "</span> << curr_offset << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> diff --git a/html/042name.cc.html b/html/042name.cc.html index 23a3ba8f..915412f1 100644 --- a/html/042name.cc.html +++ b/html/042name.cc.html @@ -292,81 +292,100 @@ if ('onhashchange' in window) { <span id="L229" class="LineNr">229 </span><span class="SalientComment">//:: Support element names for containers in 'get' and 'get-location' and 'put'.</span> <span id="L230" class="LineNr">230 </span><span class="Comment">//: (get-location is implemented later)</span> <span id="L231" class="LineNr">231 </span> -<span id="L232" class="LineNr">232 </span><span class="Delimiter">:(scenario transform_names_transforms_container_elements)</span> -<span id="L233" class="LineNr">233 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L234" class="LineNr">234 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L235" class="LineNr">235 </span> <span class="Normal">a</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span> -<span id="L236" class="LineNr">236 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span> -<span id="L237" class="LineNr">237 </span>] -<span id="L238" class="LineNr">238 </span><span class="traceContains">+name: element y of type point is at offset 1</span> -<span id="L239" class="LineNr">239 </span><span class="traceContains">+name: element x of type point is at offset 0</span> +<span id="L232" class="LineNr">232 </span><span class="Delimiter">:(before "End update GET offset_value in Check")</span> +<span id="L233" class="LineNr">233 </span><span class="Normal">else</span> <span class="Delimiter">{</span> +<span id="L234" class="LineNr">234 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!offset<span class="Delimiter">.</span>initialized<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L235" class="LineNr">235 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"uninitialized offset '"</span> << offset<span class="Delimiter">.</span>name << <span class="Constant">"' in '"</span> << to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L236" class="LineNr">236 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L237" class="LineNr">237 </span> <span class="Delimiter">}</span> +<span id="L238" class="LineNr">238 </span> offset_value = offset<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L239" class="LineNr">239 </span><span class="Delimiter">}</span> <span id="L240" class="LineNr">240 </span> -<span id="L241" class="LineNr">241 </span><span class="Delimiter">:(before "End transform_names(inst) Special-cases")</span> -<span id="L242" class="LineNr">242 </span><span class="Comment">// replace element names of containers with offsets</span> -<span id="L243" class="LineNr">243 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"get"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"get-location"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"put"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L244" class="LineNr">244 </span> <span class="Comment">//: avoid raising any errors here; later layers will support overloading new</span> -<span id="L245" class="LineNr">245 </span> <span class="Comment">//: instructions with the same names (static dispatch), which could lead to</span> -<span id="L246" class="LineNr">246 </span> <span class="Comment">//: spurious errors</span> -<span id="L247" class="LineNr">247 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> < <span class="Constant">2</span><span class="Delimiter">)</span> -<span id="L248" class="LineNr">248 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> -<span id="L249" class="LineNr">249 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>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="L250" class="LineNr">250 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> -<span id="L251" class="LineNr">251 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L252" class="LineNr">252 </span> <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span> -<span id="L253" class="LineNr">253 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> -<span id="L254" class="LineNr">254 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span> -<span id="L255" class="LineNr">255 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> -<span id="L256" class="LineNr">256 </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">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> -<span id="L257" class="LineNr">257 </span> 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 href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> -<span id="L258" class="LineNr">258 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"element "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" is at offset "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L259" class="LineNr">259 </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="Delimiter">}</span> -<span id="L262" class="LineNr">262 </span> -<span id="L263" class="LineNr">263 </span><span class="Comment">//: this test is actually illegal so can't call run</span> -<span id="L264" class="LineNr">264 </span><span class="Delimiter">:(scenarios transform)</span> -<span id="L265" class="LineNr">265 </span><span class="Delimiter">:(scenario transform_names_handles_containers)</span> -<span id="L266" class="LineNr">266 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L267" class="LineNr">267 </span> <span class="Normal">a</span>:point<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe -<span id="L268" class="LineNr">268 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe -<span id="L269" class="LineNr">269 </span>] -<span id="L270" class="LineNr">270 </span><span class="traceContains">+name: assign a 1</span> -<span id="L271" class="LineNr">271 </span><span class="traceContains">+name: assign b 3</span> -<span id="L272" class="LineNr">272 </span> -<span id="L273" class="LineNr">273 </span><span class="SalientComment">//:: Support variant names for exclusive containers in 'maybe-convert'.</span> -<span id="L274" class="LineNr">274 </span> -<span id="L275" class="LineNr">275 </span><span class="Delimiter">:(scenarios run)</span> -<span id="L276" class="LineNr">276 </span><span class="Delimiter">:(scenario transform_names_handles_exclusive_containers)</span> -<span id="L277" class="LineNr">277 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L278" class="LineNr">278 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> -<span id="L279" class="LineNr">279 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L280" class="LineNr">280 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> -<span id="L281" class="LineNr">281 </span> <span class="Constant">20</span>:point<span class="Delimiter">,</span> <span class="Constant">22</span>:<span class="Normal">bool</span><span class="Special"> <- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">p:variant</span> -<span id="L282" class="LineNr">282 </span>] -<span id="L283" class="LineNr">283 </span><span class="traceContains">+name: variant p of type number-or-point has tag 1</span> -<span id="L284" class="LineNr">284 </span><span class="traceContains">+mem: storing 1 in location 22</span> -<span id="L285" class="LineNr">285 </span><span class="traceContains">+mem: storing 35 in location 20</span> -<span id="L286" class="LineNr">286 </span><span class="traceContains">+mem: storing 36 in location 21</span> -<span id="L287" class="LineNr">287 </span> -<span id="L288" class="LineNr">288 </span><span class="Delimiter">:(before "End transform_names(inst) Special-cases")</span> -<span id="L289" class="LineNr">289 </span><span class="Comment">// convert variant names of exclusive containers</span> -<span id="L290" class="LineNr">290 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"maybe-convert"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L291" class="LineNr">291 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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="L292" class="LineNr">292 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"exactly 2 ingredients expected in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L293" class="LineNr">293 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L294" class="LineNr">294 </span> <span class="Delimiter">}</span> -<span id="L295" class="LineNr">295 </span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>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="L296" class="LineNr">296 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L297" class="LineNr">297 </span> <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span> -<span id="L298" class="LineNr">298 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> -<span id="L299" class="LineNr">299 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>base_type == -<span class="Constant">1</span><span class="Delimiter">)</span> -<span id="L300" class="LineNr">300 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"expected an exclusive-container in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L301" class="LineNr">301 </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">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> -<span id="L302" class="LineNr">302 </span> 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 href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> -<span id="L303" class="LineNr">303 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"variant "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" has tag "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L304" class="LineNr">304 </span> <span class="Delimiter">}</span> -<span id="L305" class="LineNr">305 </span> <span class="Delimiter">}</span> -<span id="L306" class="LineNr">306 </span><span class="Delimiter">}</span> +<span id="L241" class="LineNr">241 </span><span class="Delimiter">:(scenario transform_names_transforms_container_elements)</span> +<span id="L242" class="LineNr">242 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L243" class="LineNr">243 </span> <span class="Normal">p</span>:&:point<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L244" class="LineNr">244 </span> <span class="Normal">a</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">y:offset</span> +<span id="L245" class="LineNr">245 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>get *p:&:point<span class="Delimiter">,</span> <span class="Constant">x:offset</span> +<span id="L246" class="LineNr">246 </span>] +<span id="L247" class="LineNr">247 </span><span class="traceContains">+name: element y of type point is at offset 1</span> +<span id="L248" class="LineNr">248 </span><span class="traceContains">+name: element x of type point is at offset 0</span> +<span id="L249" class="LineNr">249 </span> +<span id="L250" class="LineNr">250 </span><span class="Delimiter">:(before "End transform_names(inst) Special-cases")</span> +<span id="L251" class="LineNr">251 </span><span class="Comment">// replace element names of containers with offsets</span> +<span id="L252" class="LineNr">252 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"get"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"get-location"</span> || inst<span class="Delimiter">.</span>name == <span class="Constant">"put"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L253" class="LineNr">253 </span> <span class="Comment">//: avoid raising any errors here; later layers will support overloading new</span> +<span id="L254" class="LineNr">254 </span> <span class="Comment">//: instructions with the same names (static dispatch), which could lead to</span> +<span id="L255" class="LineNr">255 </span> <span class="Comment">//: spurious errors</span> +<span id="L256" class="LineNr">256 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> < <span class="Constant">2</span><span class="Delimiter">)</span> +<span id="L257" class="LineNr">257 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> +<span id="L258" class="LineNr">258 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal<span class="Delimiter">(</span>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="L259" class="LineNr">259 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span class="Comment">// error raised elsewhere</span> +<span id="L260" class="LineNr">260 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L261" class="LineNr">261 </span> <span class="Comment">// since first non-address in base type must be a container, we don't have to canonize</span> +<span id="L262" class="LineNr">262 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> +<span id="L263" class="LineNr">263 </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">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> +<span id="L264" class="LineNr">264 </span> 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 href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L265" class="LineNr">265 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"element "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" is at offset "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L266" class="LineNr">266 </span> <span class="Delimiter">}</span> +<span id="L267" class="LineNr">267 </span> <span class="Delimiter">}</span> +<span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span> +<span id="L269" class="LineNr">269 </span> +<span id="L270" class="LineNr">270 </span><span class="Delimiter">:(scenario missing_type_in_get)</span> +<span id="L271" class="LineNr">271 </span><span class="Special">% Hide_errors = true;</span> +<span id="L272" class="LineNr">272 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L273" class="LineNr">273 </span> get a<span class="Delimiter">,</span> <span class="Constant">x:offset</span> +<span id="L274" class="LineNr">274 </span>] +<span id="L275" class="LineNr">275 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'a' in 'get a, x:offset'</span> +<span id="L276" class="LineNr">276 </span> +<span id="L277" class="LineNr">277 </span><span class="Comment">//: this test is actually illegal so can't call run</span> +<span id="L278" class="LineNr">278 </span><span class="Delimiter">:(scenarios transform)</span> +<span id="L279" class="LineNr">279 </span><span class="Delimiter">:(scenario transform_names_handles_containers)</span> +<span id="L280" class="LineNr">280 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L281" class="LineNr">281 </span> <span class="Normal">a</span>:point<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe +<span id="L282" class="LineNr">282 </span> <span class="Normal">b</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span>/unsafe +<span id="L283" class="LineNr">283 </span>] +<span id="L284" class="LineNr">284 </span><span class="traceContains">+name: assign a 1</span> +<span id="L285" class="LineNr">285 </span><span class="traceContains">+name: assign b 3</span> +<span id="L286" class="LineNr">286 </span> +<span id="L287" class="LineNr">287 </span><span class="SalientComment">//:: Support variant names for exclusive containers in 'maybe-convert'.</span> +<span id="L288" class="LineNr">288 </span> +<span id="L289" class="LineNr">289 </span><span class="Delimiter">:(scenarios run)</span> +<span id="L290" class="LineNr">290 </span><span class="Delimiter">:(scenario transform_names_handles_exclusive_containers)</span> +<span id="L291" class="LineNr">291 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L292" class="LineNr">292 </span> <span class="Constant">12</span>:num<span class="Special"> <- </span>copy <span class="Constant">1</span> +<span id="L293" class="LineNr">293 </span> <span class="Constant">13</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L294" class="LineNr">294 </span> <span class="Constant">14</span>:num<span class="Special"> <- </span>copy <span class="Constant">36</span> +<span id="L295" class="LineNr">295 </span> <span class="Constant">20</span>:point<span class="Delimiter">,</span> <span class="Constant">22</span>:<span class="Normal">bool</span><span class="Special"> <- </span>maybe-convert <span class="Constant">12</span>:number-<span class="Normal">or</span>-point/unsafe<span class="Delimiter">,</span> <span class="Constant">p:variant</span> +<span id="L296" class="LineNr">296 </span>] +<span id="L297" class="LineNr">297 </span><span class="traceContains">+name: variant p of type number-or-point has tag 1</span> +<span id="L298" class="LineNr">298 </span><span class="traceContains">+mem: storing 1 in location 22</span> +<span id="L299" class="LineNr">299 </span><span class="traceContains">+mem: storing 35 in location 20</span> +<span id="L300" class="LineNr">300 </span><span class="traceContains">+mem: storing 36 in location 21</span> +<span id="L301" class="LineNr">301 </span> +<span id="L302" class="LineNr">302 </span><span class="Delimiter">:(before "End transform_names(inst) Special-cases")</span> +<span id="L303" class="LineNr">303 </span><span class="Comment">// convert variant names of exclusive containers</span> +<span id="L304" class="LineNr">304 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">"maybe-convert"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L305" class="LineNr">305 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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="L306" class="LineNr">306 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"exactly 2 ingredients expected in '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L307" class="LineNr">307 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L308" class="LineNr">308 </span> <span class="Delimiter">}</span> +<span id="L309" class="LineNr">309 </span> assert<span class="Delimiter">(</span>is_literal<span class="Delimiter">(</span>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="L310" class="LineNr">310 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">.</span>find_first_not_of<span class="Delimiter">(</span><span class="Constant">"0123456789"</span><span class="Delimiter">)</span> != string::npos<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L311" class="LineNr">311 </span> <span class="Comment">// since first non-address in base type must be an exclusive container, we don't have to canonize</span> +<span id="L312" class="LineNr">312 </span> <a href='010vm.cc.html#L124'>type_ordinal</a> base_type = <a href='042name.cc.html#L120'>skip_addresses</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>type<span class="Delimiter">);</span> +<span id="L313" class="LineNr">313 </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">))</span> <span class="Delimiter">{</span> <span class="Comment">// otherwise we'll raise an error elsewhere</span> +<span id="L314" class="LineNr">314 </span> 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 href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='042name.cc.html#L133'>find_element_name</a><span class="Delimiter">(</span>base_type<span class="Delimiter">,</span> inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">,</span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">));</span> +<span id="L315" class="LineNr">315 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9993</span><span class="Delimiter">,</span> <span class="Constant">"name"</span><span class="Delimiter">)</span> << <span class="Constant">"variant "</span> << inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name << <span class="Constant">" of type "</span> << get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">).</span>name << <span class="Constant">" has tag "</span> << no_scientific<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>value<span class="Delimiter">)</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L316" class="LineNr">316 </span> <span class="Delimiter">}</span> +<span id="L317" class="LineNr">317 </span> <span class="Delimiter">}</span> +<span id="L318" class="LineNr">318 </span><span class="Delimiter">}</span> +<span id="L319" class="LineNr">319 </span> +<span id="L320" class="LineNr">320 </span><span class="Delimiter">:(scenario missing_type_in_maybe_convert)</span> +<span id="L321" class="LineNr">321 </span><span class="Special">% Hide_errors = true;</span> +<span id="L322" class="LineNr">322 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L323" class="LineNr">323 </span> maybe-convert a<span class="Delimiter">,</span> <span class="Constant">x:variant</span> +<span id="L324" class="LineNr">324 </span>] +<span id="L325" class="LineNr">325 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: missing type for 'a' in 'maybe-convert a, x:variant'</span> </pre> </body> </html> diff --git a/html/050scenario.cc.html b/html/050scenario.cc.html index a55c1e5a..e96df0bc 100644 --- a/html/050scenario.cc.html +++ b/html/050scenario.cc.html @@ -129,772 +129,793 @@ if ('onhashchange' in window) { <span id="L64" class="LineNr"> 64 </span><span class="Delimiter">};</span> <span id="L65" class="LineNr"> 65 </span> <span id="L66" class="LineNr"> 66 </span><span class="Delimiter">:(before "End Globals")</span> -<span id="L67" class="LineNr"> 67 </span>vector<scenario> Scenarios<span class="Delimiter">;</span> -<span id="L68" class="LineNr"> 68 </span> -<span id="L69" class="LineNr"> 69 </span><span class="SalientComment">//:: Parse the 'scenario' form.</span> -<span id="L70" class="LineNr"> 70 </span><span class="Comment">//: Simply store the text of the scenario.</span> -<span id="L71" class="LineNr"> 71 </span> -<span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before "End Command Handlers")</span> -<span id="L73" class="LineNr"> 73 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L74" class="LineNr"> 74 </span> <a href='050scenario.cc.html#L57'>scenario</a> result = <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L75" class="LineNr"> 75 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> -<span id="L76" class="LineNr"> 76 </span> Scenarios<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> -<span id="L77" class="LineNr"> 77 </span><span class="Delimiter">}</span> -<span id="L78" class="LineNr"> 78 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"pending-scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L79" class="LineNr"> 79 </span> <span class="Comment">// for temporary use only</span> -<span id="L80" class="LineNr"> 80 </span> <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Comment">// discard</span> -<span id="L81" class="LineNr"> 81 </span><span class="Delimiter">}</span> -<span id="L82" class="LineNr"> 82 </span> -<span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(code)</span> -<span id="L84" class="LineNr"> 84 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L85" class="LineNr"> 85 </span> <a href='050scenario.cc.html#L57'>scenario</a> result<span class="Delimiter">;</span> -<span id="L86" class="LineNr"> 86 </span> result<span class="Delimiter">.</span>name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L87" class="LineNr"> 87 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L88" class="LineNr"> 88 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L89" class="LineNr"> 89 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='050scenario.cc.html#L57'>scenario</a> at <a href='003trace.cc.html#L195'>end</a> of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L90" class="LineNr"> 90 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L91" class="LineNr"> 91 </span> <span class="Delimiter">}</span> -<span id="L92" class="LineNr"> 92 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L93" class="LineNr"> 93 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L94" class="LineNr"> 94 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Expected '[' after <a href='050scenario.cc.html#L57'>scenario</a> '"</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L95" class="LineNr"> 95 </span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> -<span id="L97" class="LineNr"> 97 </span> <span class="Comment">// scenarios are take special 'code' strings so we need to ignore brackets</span> -<span id="L98" class="LineNr"> 98 </span> <span class="Comment">// inside comments</span> -<span id="L99" class="LineNr"> 99 </span> result<span class="Delimiter">.</span>to_run = <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L100" class="LineNr">100 </span> <span class="Comment">// delete [] delimiters</span> -<span id="L101" class="LineNr">101 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">,</span> <span class="Constant">"["</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L102" class="LineNr">102 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should start with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L103" class="LineNr">103 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> -<span id="L104" class="LineNr">104 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L105" class="LineNr">105 </span> <span class="Delimiter">}</span> -<span id="L106" class="LineNr">106 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> -<span id="L107" class="LineNr">107 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>at<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L108" class="LineNr">108 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L109" class="LineNr">109 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> -<span id="L110" class="LineNr">110 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L111" class="LineNr">111 </span> <span class="Delimiter">}</span> -<span id="L112" class="LineNr">112 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> -<span id="L113" class="LineNr">113 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L114" class="LineNr">114 </span><span class="Delimiter">}</span> -<span id="L115" class="LineNr">115 </span> -<span id="L116" class="LineNr">116 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment)</span> -<span id="L117" class="LineNr">117 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ -<span id="L118" class="LineNr">118 </span> <span class="Comment"># ']' in comment</span> -<span id="L119" class="LineNr">119 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> -<span id="L120" class="LineNr">120 </span>] -<span id="L121" class="LineNr">121 </span><span class="traceContains">+run: {1: "number"} <- copy {0: "literal"}</span> -<span id="L122" class="LineNr">122 </span> -<span id="L123" class="LineNr">123 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment_in_nested_string)</span> -<span id="L124" class="LineNr">124 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ -<span id="L125" class="LineNr">125 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [<span class="Comment"># not a comment]</span> -<span id="L126" class="LineNr">126 </span>] -<span id="L127" class="LineNr">127 </span><span class="traceContains">+run: {1: ("address" "array" "character")} <- new {"# not a comment": "literal-string"}</span> -<span id="L128" class="LineNr">128 </span> -<span id="L129" class="LineNr">129 </span><span class="SalientComment">//:: Run scenarios when we run './mu test'.</span> -<span id="L130" class="LineNr">130 </span><span class="Comment">//: Treat the text of the scenario as a regular series of instructions.</span> -<span id="L131" class="LineNr">131 </span> -<span id="L132" class="LineNr">132 </span><span class="Delimiter">:(before "End Globals")</span> -<span id="L133" class="LineNr">133 </span><span class="Normal">int</span> Num_core_mu_scenarios = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L134" class="LineNr">134 </span><span class="Delimiter">:(after "Check For .mu Files")</span> -<span id="L135" class="LineNr">135 </span>Num_core_mu_scenarios = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> -<span id="L136" class="LineNr">136 </span><span class="Delimiter">:(before "End Tests")</span> -<span id="L137" class="LineNr">137 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L138" class="LineNr">138 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L139" class="LineNr">139 </span> time<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> -<span id="L140" class="LineNr">140 </span> cerr << <span class="Constant">"Mu tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> -<span id="L141" class="LineNr">141 </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 < Num_core_mu_scenarios<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L142" class="LineNr">142 </span><span class="CommentedCode">//? cerr << '\n' << i << ": " << Scenarios.at(i).name;</span> -<span id="L143" class="LineNr">143 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> -<span id="L144" class="LineNr">144 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> -<span id="L145" class="LineNr">145 </span> <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span> -<span id="L146" class="LineNr">146 </span> <span class="Delimiter">}</span> -<span id="L147" class="LineNr">147 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L148" class="LineNr">148 </span><span class="Delimiter">}</span> -<span id="L149" class="LineNr">149 </span><span class="Normal">run_app_scenarios</span>: -<span id="L150" class="LineNr">150 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L151" class="LineNr">151 </span> time<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> -<span id="L152" class="LineNr">152 </span> cerr << <span class="Constant">"App tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> -<span id="L153" class="LineNr">153 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = Num_core_mu_scenarios<span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L154" class="LineNr">154 </span><span class="CommentedCode">//? cerr << '\n' << i << ": " << Scenarios.at(i).name;</span> -<span id="L155" class="LineNr">155 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> -<span id="L156" class="LineNr">156 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> -<span id="L157" class="LineNr">157 </span> <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span> -<span id="L158" class="LineNr">158 </span> <span class="Delimiter">}</span> -<span id="L159" class="LineNr">159 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L160" class="LineNr">160 </span><span class="Delimiter">}</span> -<span id="L161" class="LineNr">161 </span> -<span id="L162" class="LineNr">162 </span><span class="Comment">//: For faster debugging, support running tests for just the Mu app(s) we are</span> -<span id="L163" class="LineNr">163 </span><span class="Comment">//: loading.</span> -<span id="L164" class="LineNr">164 </span><span class="Delimiter">:(before "End Globals")</span> -<span id="L165" class="LineNr">165 </span><span class="Normal">bool</span> Test_only_app = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L166" class="LineNr">166 </span><span class="Delimiter">:(before "End Commandline Options(*arg)")</span> -<span id="L167" class="LineNr">167 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--test-only-app"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L168" class="LineNr">168 </span> Test_only_app = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L67" class="LineNr"> 67 </span>vector<scenario> Scenarios<span class="Delimiter">,</span> Scenarios_snapshot<span class="Delimiter">;</span> +<span id="L68" class="LineNr"> 68 </span>set<string> Scenario_names<span class="Delimiter">,</span> Scenario_names_snapshot<span class="Delimiter">;</span> +<span id="L69" class="LineNr"> 69 </span><span class="Delimiter">:(before "End save_snapshots")</span> +<span id="L70" class="LineNr"> 70 </span>Scenarios_snapshot = Scenarios<span class="Delimiter">;</span> +<span id="L71" class="LineNr"> 71 </span>Scenario_names_snapshot = Scenario_names<span class="Delimiter">;</span> +<span id="L72" class="LineNr"> 72 </span><span class="Delimiter">:(before "End restore_snapshots")</span> +<span id="L73" class="LineNr"> 73 </span>Scenarios = Scenarios_snapshot<span class="Delimiter">;</span> +<span id="L74" class="LineNr"> 74 </span>Scenario_names = Scenario_names_snapshot<span class="Delimiter">;</span> +<span id="L75" class="LineNr"> 75 </span> +<span id="L76" class="LineNr"> 76 </span><span class="SalientComment">//:: Parse the 'scenario' form.</span> +<span id="L77" class="LineNr"> 77 </span><span class="Comment">//: Simply store the text of the scenario.</span> +<span id="L78" class="LineNr"> 78 </span> +<span id="L79" class="LineNr"> 79 </span><span class="Delimiter">:(before "End Command Handlers")</span> +<span id="L80" class="LineNr"> 80 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L81" class="LineNr"> 81 </span> <a href='050scenario.cc.html#L57'>scenario</a> result = <a href='050scenario.cc.html#L91'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L82" class="LineNr"> 82 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> +<span id="L83" class="LineNr"> 83 </span> Scenarios<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> +<span id="L84" class="LineNr"> 84 </span><span class="Delimiter">}</span> +<span id="L85" class="LineNr"> 85 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>command == <span class="Constant">"pending-scenario"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L86" class="LineNr"> 86 </span> <span class="Comment">// for temporary use only</span> +<span id="L87" class="LineNr"> 87 </span> <a href='050scenario.cc.html#L91'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> <span class="Comment">// discard</span> +<span id="L88" class="LineNr"> 88 </span><span class="Delimiter">}</span> +<span id="L89" class="LineNr"> 89 </span> +<span id="L90" class="LineNr"> 90 </span><span class="Delimiter">:(code)</span> +<span id="L91" class="LineNr"> 91 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> <a href='050scenario.cc.html#L91'>parse_scenario</a><span class="Delimiter">(</span>istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L92" class="LineNr"> 92 </span> <a href='050scenario.cc.html#L57'>scenario</a> result<span class="Delimiter">;</span> +<span id="L93" class="LineNr"> 93 </span> result<span class="Delimiter">.</span>name = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L94" class="LineNr"> 94 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>Scenario_names<span class="Delimiter">,</span> result<span class="Delimiter">.</span>name<span class="Delimiter">))</span> +<span id="L95" class="LineNr"> 95 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"duplicate <a href='050scenario.cc.html#L57'>scenario</a> name: '"</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L96" class="LineNr"> 96 </span> Scenario_names<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">);</span> +<span id="L97" class="LineNr"> 97 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>name<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L98" class="LineNr"> 98 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L99" class="LineNr"> 99 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete <a href='050scenario.cc.html#L57'>scenario</a> at <a href='003trace.cc.html#L195'>end</a> of file</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L100" class="LineNr">100 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L101" class="LineNr">101 </span> <span class="Delimiter">}</span> +<span id="L102" class="LineNr">102 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L103" class="LineNr">103 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()</span> != <span class="Constant">'['</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L104" class="LineNr">104 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"Expected '[' after <a href='050scenario.cc.html#L57'>scenario</a> '"</span> << result<span class="Delimiter">.</span>name << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L105" class="LineNr">105 </span> exit<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L106" class="LineNr">106 </span> <span class="Delimiter">}</span> +<span id="L107" class="LineNr">107 </span> <span class="Comment">// scenarios are take special 'code' strings so we need to ignore brackets</span> +<span id="L108" class="LineNr">108 </span> <span class="Comment">// inside comments</span> +<span id="L109" class="LineNr">109 </span> result<span class="Delimiter">.</span>to_run = <a href='014literal_string.cc.html#L33'>slurp_quoted</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L110" class="LineNr">110 </span> <span class="Comment">// delete [] delimiters</span> +<span id="L111" class="LineNr">111 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!starts_with<span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">,</span> <span class="Constant">"["</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L112" class="LineNr">112 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" should start with '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L113" class="LineNr">113 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L114" class="LineNr">114 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L115" class="LineNr">115 </span> <span class="Delimiter">}</span> +<span id="L116" class="LineNr">116 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L117" class="LineNr">117 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>at<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">)</span> != <span class="Constant">']'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L118" class="LineNr">118 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"scenario "</span> << result<span class="Delimiter">.</span>name << <span class="Constant">" has an unbalanced '['</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L119" class="LineNr">119 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L120" class="LineNr">120 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L121" class="LineNr">121 </span> <span class="Delimiter">}</span> +<span id="L122" class="LineNr">122 </span> result<span class="Delimiter">.</span>to_run<span class="Delimiter">.</span>erase<span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>result<span class="Delimiter">.</span>to_run<span class="Delimiter">)</span>-<span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L123" class="LineNr">123 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L124" class="LineNr">124 </span><span class="Delimiter">}</span> +<span id="L125" class="LineNr">125 </span> +<span id="L126" class="LineNr">126 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment)</span> +<span id="L127" class="LineNr">127 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ +<span id="L128" class="LineNr">128 </span> <span class="Comment"># ']' in comment</span> +<span id="L129" class="LineNr">129 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L130" class="LineNr">130 </span>] +<span id="L131" class="LineNr">131 </span><span class="traceContains">+run: {1: "number"} <- copy {0: "literal"}</span> +<span id="L132" class="LineNr">132 </span> +<span id="L133" class="LineNr">133 </span><span class="Delimiter">:(scenario read_scenario_with_bracket_in_comment_in_nested_string)</span> +<span id="L134" class="LineNr">134 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ +<span id="L135" class="LineNr">135 </span> <span class="Constant">1</span>:text<span class="Special"> <- </span><span class="Normal">new</span> [<span class="Comment"># not a comment]</span> +<span id="L136" class="LineNr">136 </span>] +<span id="L137" class="LineNr">137 </span><span class="traceContains">+run: {1: ("address" "array" "character")} <- new {"# not a comment": "literal-string"}</span> +<span id="L138" class="LineNr">138 </span> +<span id="L139" class="LineNr">139 </span><span class="Delimiter">:(scenarios run)</span> +<span id="L140" class="LineNr">140 </span><span class="Delimiter">:(scenario duplicate_scenarios)</span> +<span id="L141" class="LineNr">141 </span><span class="Special">% Hide_errors = true;</span> +<span id="L142" class="LineNr">142 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ +<span id="L143" class="LineNr">143 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L144" class="LineNr">144 </span>] +<span id="L145" class="LineNr">145 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ +<span id="L146" class="LineNr">146 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">0</span> +<span id="L147" class="LineNr">147 </span>] +<span id="L148" class="LineNr">148 </span><span class="traceContains">+error: duplicate <a href='050scenario.cc.html#L57'>scenario</a> name: 'foo'</span> +<span id="L149" class="LineNr">149 </span> +<span id="L150" class="LineNr">150 </span><span class="SalientComment">//:: Run scenarios when we run './mu test'.</span> +<span id="L151" class="LineNr">151 </span><span class="Comment">//: Treat the text of the scenario as a regular series of instructions.</span> +<span id="L152" class="LineNr">152 </span> +<span id="L153" class="LineNr">153 </span><span class="Delimiter">:(before "End Globals")</span> +<span id="L154" class="LineNr">154 </span><span class="Normal">int</span> Num_core_mu_scenarios = <span class="Constant">0</span><span class="Delimiter">;</span> +<span id="L155" class="LineNr">155 </span><span class="Delimiter">:(after "Check For .mu Files")</span> +<span id="L156" class="LineNr">156 </span>Num_core_mu_scenarios = <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> +<span id="L157" class="LineNr">157 </span><span class="Delimiter">:(before "End Tests")</span> +<span id="L158" class="LineNr">158 </span>Hide_missing_default_space_errors = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L159" class="LineNr">159 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios > <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L160" class="LineNr">160 </span> time<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> +<span id="L161" class="LineNr">161 </span> cerr << <span class="Constant">"Mu tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> +<span id="L162" class="LineNr">162 </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 < Num_core_mu_scenarios<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L163" class="LineNr">163 </span><span class="CommentedCode">//? cerr << '\n' << i << ": " << Scenarios.at(i).name;</span> +<span id="L164" class="LineNr">164 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L165" class="LineNr">165 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> +<span id="L166" class="LineNr">166 </span> <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span> +<span id="L167" class="LineNr">167 </span> <span class="Delimiter">}</span> +<span id="L168" class="LineNr">168 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> <span id="L169" class="LineNr">169 </span><span class="Delimiter">}</span> -<span id="L170" class="LineNr">170 </span><span class="Delimiter">:(after "End Test Run Initialization")</span> -<span id="L171" class="LineNr">171 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app && Num_core_mu_scenarios < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L172" class="LineNr">172 </span> <span class="Identifier">goto</span> run_app_scenarios<span class="Delimiter">;</span> -<span id="L173" class="LineNr">173 </span><span class="Delimiter">}</span> -<span id="L174" class="LineNr">174 </span> -<span id="L175" class="LineNr">175 </span><span class="Comment">//: Convenience: run a single named scenario.</span> -<span id="L176" class="LineNr">176 </span><span class="Delimiter">:(after "Test Runs")</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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L178" class="LineNr">178 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[argc-<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L179" class="LineNr">179 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L180" class="LineNr">180 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> -<span id="L181" class="LineNr">181 </span> Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L182" class="LineNr">182 </span> <span class="Delimiter">}</span> -<span id="L183" class="LineNr">183 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> -<span id="L184" class="LineNr">184 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">".</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> -<span id="L185" class="LineNr">185 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L186" class="LineNr">186 </span> <span class="Delimiter">}</span> -<span id="L187" class="LineNr">187 </span><span class="Delimiter">}</span> -<span id="L188" class="LineNr">188 </span> -<span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before "End Globals")</span> -<span id="L190" class="LineNr">190 </span><span class="Comment">// this isn't a constant, just a global of type const*</span> -<span id="L191" class="LineNr">191 </span><span class="Normal">const</span> scenario* Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span> -<span id="L192" class="LineNr">192 </span><span class="Delimiter">:(code)</span> -<span id="L193" class="LineNr">193 </span><span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> scenario& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L194" class="LineNr">194 </span> Current_scenario = &s<span class="Delimiter">;</span> -<span id="L195" class="LineNr">195 </span> <span class="Normal">bool</span> not_already_inside_test = !Trace_stream<span class="Delimiter">;</span> -<span id="L196" class="LineNr">196 </span><span class="CommentedCode">//? cerr << s.name << '\n';</span> -<span id="L197" class="LineNr">197 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L198" class="LineNr">198 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> -<span id="L199" class="LineNr">199 </span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">();</span> -<span id="L200" class="LineNr">200 </span> <span class="Delimiter">}</span> -<span id="L201" class="LineNr">201 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span><span class="Constant">"recipe scenario_"</span>+s<span class="Delimiter">.</span>name+<span class="Constant">" [ "</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">" ]"</span><span class="Delimiter">);</span> -<span id="L202" class="LineNr">202 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L203" class="LineNr">203 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L204" class="LineNr">204 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> -<span id="L205" class="LineNr">205 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">())</span> -<span id="L206" class="LineNr">206 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span> -<span id="L207" class="LineNr">207 </span> <span class="Comment">// End Mu Test Teardown</span> -<span id="L208" class="LineNr">208 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors && <a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">()</span> && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L209" class="LineNr">209 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L210" class="LineNr">210 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test && Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L211" class="LineNr">211 </span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">();</span> -<span id="L212" class="LineNr">212 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L213" class="LineNr">213 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> -<span id="L214" class="LineNr">214 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> -<span id="L215" class="LineNr">215 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> -<span id="L216" class="LineNr">216 </span> <span class="Delimiter">}</span> -<span id="L217" class="LineNr">217 </span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span> -<span id="L218" class="LineNr">218 </span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> -<span id="L219" class="LineNr">219 </span> <span class="Delimiter">}</span> -<span id="L220" class="LineNr">220 </span> Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span> -<span id="L221" class="LineNr">221 </span><span class="Delimiter">}</span> -<span id="L222" class="LineNr">222 </span> -<span id="L223" class="LineNr">223 </span><span class="Comment">//: Permit numeric locations to be accessed in scenarios.</span> -<span id="L224" class="LineNr">224 </span><span class="Delimiter">:(before "End check_default_space Special-cases")</span> -<span id="L225" class="LineNr">225 </span><span class="Comment">// user code should never create recipes with underscores in their names</span> -<span id="L226" class="LineNr">226 </span><span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"scenario_"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// skip Mu scenarios which will use raw memory locations</span> -<span id="L227" class="LineNr">227 </span><span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"run_"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// skip calls to 'run', which should be in scenarios and will also use raw memory locations</span> -<span id="L228" class="LineNr">228 </span> -<span id="L229" class="LineNr">229 </span><span class="Comment">//: Some variables for fake resources always get special /raw addresses in scenarios.</span> -<span id="L230" class="LineNr">230 </span> -<span id="L231" class="LineNr">231 </span><span class="Delimiter">:(code)</span> -<span id="L232" class="LineNr">232 </span><span class="Comment">// Should contain everything passed by is_special_name but failed by is_disqualified.</span> -<span id="L233" class="LineNr">233 </span><span class="Normal">void</span> bind_special_scenario_names<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L234" class="LineNr">234 </span> <span class="Comment">// Special Scenario Variable Names(r)</span> -<span id="L235" class="LineNr">235 </span> <span class="Comment">// End Special Scenario Variable Names(r)</span> -<span id="L236" class="LineNr">236 </span><span class="Delimiter">}</span> -<span id="L237" class="LineNr">237 </span><span class="Delimiter">:(before "Done Placing Ingredient(ingredient, inst, caller)")</span> -<span id="L238" class="LineNr">238 </span>maybe_make_raw<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">);</span> -<span id="L239" class="LineNr">239 </span><span class="Delimiter">:(before "Done Placing Product(product, inst, caller)")</span> -<span id="L240" class="LineNr">240 </span>maybe_make_raw<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">);</span> -<span id="L241" class="LineNr">241 </span><span class="Delimiter">:(code)</span> -<span id="L242" class="LineNr">242 </span><span class="Normal">void</span> maybe_make_raw<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L243" class="LineNr">243 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_special_name<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L244" class="LineNr">244 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"scenario_"</span><span class="Delimiter">))</span> -<span id="L245" class="LineNr">245 </span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> -<span id="L246" class="LineNr">246 </span> <span class="Comment">// End maybe_make_raw</span> -<span id="L247" class="LineNr">247 </span><span class="Delimiter">}</span> -<span id="L248" class="LineNr">248 </span> -<span id="L249" class="LineNr">249 </span><span class="Comment">//: Test.</span> -<span id="L250" class="LineNr">250 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> -<span id="L251" class="LineNr">251 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"__maybe_make_raw_test__"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L252" class="LineNr">252 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> -<span id="L253" class="LineNr">253 </span><span class="Comment">//: ugly: we only need this for this one test, but need to define it for all time</span> -<span id="L254" class="LineNr">254 </span>Name[r][<span class="Constant">"__maybe_make_raw_test__"</span>] = Reserved_for_tests-<span class="Constant">1</span><span class="Delimiter">;</span> -<span id="L255" class="LineNr">255 </span><span class="Delimiter">:(code)</span> -<span id="L256" class="LineNr">256 </span><span class="Normal">void</span> test_maybe_make_raw<span class="Delimiter">()</span> <span class="Delimiter">{</span> -<span id="L257" class="LineNr">257 </span> <span class="Comment">// check that scenarios can use local-scope and special variables together</span> -<span id="L258" class="LineNr">258 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span> -<span id="L259" class="LineNr">259 </span> <span class="Constant">"def scenario_foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L260" class="LineNr">260 </span> <span class="Constant">" local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L261" class="LineNr">261 </span> <span class="Constant">" __maybe_make_raw_test__:num <- copy 34</span><span class="cSpecial">\n</span><span class="Constant">"</span> -<span id="L262" class="LineNr">262 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L263" class="LineNr">263 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L264" class="LineNr">264 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L265" class="LineNr">265 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> -<span id="L266" class="LineNr">266 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> -<span id="L267" class="LineNr">267 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> +<span id="L170" class="LineNr">170 </span><span class="Normal">run_app_scenarios</span>: +<span id="L171" class="LineNr">171 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Num_core_mu_scenarios != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L172" class="LineNr">172 </span> time<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> +<span id="L173" class="LineNr">173 </span> cerr << <span class="Constant">"App tests: "</span> << ctime<span class="Delimiter">(</span>&t<span class="Delimiter">);</span> +<span id="L174" class="LineNr">174 </span> <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = Num_core_mu_scenarios<span class="Delimiter">;</span> i < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L175" class="LineNr">175 </span><span class="CommentedCode">//? cerr << '\n' << i << ": " << Scenarios.at(i).name;</span> +<span id="L176" class="LineNr">176 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L177" class="LineNr">177 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">"."</span><span class="Delimiter">;</span> +<span id="L178" class="LineNr">178 </span> <span class="Normal">else</span> ++Num_failures<span class="Delimiter">;</span> +<span id="L179" class="LineNr">179 </span> <span class="Delimiter">}</span> +<span id="L180" class="LineNr">180 </span> cerr << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L181" class="LineNr">181 </span><span class="Delimiter">}</span> +<span id="L182" class="LineNr">182 </span> +<span id="L183" class="LineNr">183 </span><span class="Comment">//: For faster debugging, support running tests for just the Mu app(s) we are</span> +<span id="L184" class="LineNr">184 </span><span class="Comment">//: loading.</span> +<span id="L185" class="LineNr">185 </span><span class="Delimiter">:(before "End Globals")</span> +<span id="L186" class="LineNr">186 </span><span class="Normal">bool</span> Test_only_app = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L187" class="LineNr">187 </span><span class="Delimiter">:(before "End Commandline Options(*arg)")</span> +<span id="L188" class="LineNr">188 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L70'>is_equal</a><span class="Delimiter">(</span>*arg<span class="Delimiter">,</span> <span class="Constant">"--test-only-app"</span><span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L189" class="LineNr">189 </span> Test_only_app = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L190" class="LineNr">190 </span><span class="Delimiter">}</span> +<span id="L191" class="LineNr">191 </span><span class="Delimiter">:(after "End Test Run Initialization")</span> +<span id="L192" class="LineNr">192 </span><span class="Normal">if</span> <span class="Delimiter">(</span>Test_only_app && Num_core_mu_scenarios < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L193" class="LineNr">193 </span> <span class="Identifier">goto</span> run_app_scenarios<span class="Delimiter">;</span> +<span id="L194" class="LineNr">194 </span><span class="Delimiter">}</span> +<span id="L195" class="LineNr">195 </span> +<span id="L196" class="LineNr">196 </span><span class="Comment">//: Convenience: run a single named scenario.</span> +<span id="L197" class="LineNr">197 </span><span class="Delimiter">:(after "Test Runs")</span> +<span id="L198" class="LineNr">198 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>Scenarios<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L199" class="LineNr">199 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>name == argv[argc-<span class="Constant">1</span>]<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L200" class="LineNr">200 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Start_tracing<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L201" class="LineNr">201 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> +<span id="L202" class="LineNr">202 </span> Save_trace = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L203" class="LineNr">203 </span> <span class="Delimiter">}</span> +<span id="L204" class="LineNr">204 </span> run_mu_scenario<span class="Delimiter">(</span>Scenarios<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L205" class="LineNr">205 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Passed<span class="Delimiter">)</span> cerr << <span class="Constant">".</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">;</span> +<span id="L206" class="LineNr">206 </span> <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span> +<span id="L207" class="LineNr">207 </span> <span class="Delimiter">}</span> +<span id="L208" class="LineNr">208 </span><span class="Delimiter">}</span> +<span id="L209" class="LineNr">209 </span> +<span id="L210" class="LineNr">210 </span><span class="Delimiter">:(before "End Globals")</span> +<span id="L211" class="LineNr">211 </span><span class="Comment">// this isn't a constant, just a global of type const*</span> +<span id="L212" class="LineNr">212 </span><span class="Normal">const</span> scenario* Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L213" class="LineNr">213 </span><span class="Delimiter">:(code)</span> +<span id="L214" class="LineNr">214 </span><span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> scenario& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L215" class="LineNr">215 </span> Current_scenario = &s<span class="Delimiter">;</span> +<span id="L216" class="LineNr">216 </span> <span class="Normal">bool</span> not_already_inside_test = !Trace_stream<span class="Delimiter">;</span> +<span id="L217" class="LineNr">217 </span><span class="CommentedCode">//? cerr << s.name << '\n';</span> +<span id="L218" class="LineNr">218 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L219" class="LineNr">219 </span> Trace_stream = <span class="Normal">new</span> trace_stream<span class="Delimiter">;</span> +<span id="L220" class="LineNr">220 </span> <a href='000organization.cc.html#L134'>setup</a><span class="Delimiter">();</span> +<span id="L221" class="LineNr">221 </span> <span class="Delimiter">}</span> +<span id="L222" class="LineNr">222 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span><span class="Constant">"recipe scenario_"</span>+s<span class="Delimiter">.</span>name+<span class="Constant">" [ "</span>+s<span class="Delimiter">.</span>to_run+<span class="Constant">" ]"</span><span class="Delimiter">);</span> +<span id="L223" class="LineNr">223 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> +<span id="L224" class="LineNr">224 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> +<span id="L225" class="LineNr">225 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L226" class="LineNr">226 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!trace_contains_errors<span class="Delimiter">())</span> +<span id="L227" class="LineNr">227 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>front<span class="Delimiter">());</span> +<span id="L228" class="LineNr">228 </span> <span class="Comment">// End Mu Test Teardown</span> +<span id="L229" class="LineNr">229 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors && <a href='003trace.cc.html#L190'>trace_contains_errors</a><span class="Delimiter">()</span> && !Scenario_testing_scenario<span class="Delimiter">)</span> +<span id="L230" class="LineNr">230 </span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L231" class="LineNr">231 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>not_already_inside_test && Trace_stream<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L232" class="LineNr">232 </span> <a href='000organization.cc.html#L138'>teardown</a><span class="Delimiter">();</span> +<span id="L233" class="LineNr">233 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Save_trace<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L234" class="LineNr">234 </span> ofstream fout<span class="Delimiter">(</span><span class="Constant">"last_trace"</span><span class="Delimiter">);</span> +<span id="L235" class="LineNr">235 </span> fout << Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L153'>readable_contents</a><span class="Delimiter">(</span><span class="Constant">""</span><span class="Delimiter">);</span> +<span id="L236" class="LineNr">236 </span> fout<span class="Delimiter">.</span>close<span class="Delimiter">();</span> +<span id="L237" class="LineNr">237 </span> <span class="Delimiter">}</span> +<span id="L238" class="LineNr">238 </span> <span class="Normal">delete</span> Trace_stream<span class="Delimiter">;</span> +<span id="L239" class="LineNr">239 </span> Trace_stream = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L240" class="LineNr">240 </span> <span class="Delimiter">}</span> +<span id="L241" class="LineNr">241 </span> Current_scenario = <span class="Constant">NULL</span><span class="Delimiter">;</span> +<span id="L242" class="LineNr">242 </span><span class="Delimiter">}</span> +<span id="L243" class="LineNr">243 </span> +<span id="L244" class="LineNr">244 </span><span class="Comment">//: Permit numeric locations to be accessed in scenarios.</span> +<span id="L245" class="LineNr">245 </span><span class="Delimiter">:(before "End check_default_space Special-cases")</span> +<span id="L246" class="LineNr">246 </span><span class="Comment">// user code should never create recipes with underscores in their names</span> +<span id="L247" class="LineNr">247 </span><span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"scenario_"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// skip Mu scenarios which will use raw memory locations</span> +<span id="L248" class="LineNr">248 </span><span class="Normal">if</span> <span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"run_"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// skip calls to 'run', which should be in scenarios and will also use raw memory locations</span> +<span id="L249" class="LineNr">249 </span> +<span id="L250" class="LineNr">250 </span><span class="Comment">//: Some variables for fake resources always get special /raw addresses in scenarios.</span> +<span id="L251" class="LineNr">251 </span> +<span id="L252" class="LineNr">252 </span><span class="Delimiter">:(code)</span> +<span id="L253" class="LineNr">253 </span><span class="Comment">// Should contain everything passed by is_special_name but failed by is_disqualified.</span> +<span id="L254" class="LineNr">254 </span><span class="Normal">void</span> bind_special_scenario_names<span class="Delimiter">(</span><span class="Normal">const</span> <a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L255" class="LineNr">255 </span> <span class="Comment">// Special Scenario Variable Names(r)</span> +<span id="L256" class="LineNr">256 </span> <span class="Comment">// End Special Scenario Variable Names(r)</span> +<span id="L257" class="LineNr">257 </span><span class="Delimiter">}</span> +<span id="L258" class="LineNr">258 </span><span class="Delimiter">:(before "Done Placing Ingredient(ingredient, inst, caller)")</span> +<span id="L259" class="LineNr">259 </span>maybe_make_raw<span class="Delimiter">(</span>ingredient<span class="Delimiter">,</span> caller<span class="Delimiter">);</span> +<span id="L260" class="LineNr">260 </span><span class="Delimiter">:(before "Done Placing Product(product, inst, caller)")</span> +<span id="L261" class="LineNr">261 </span>maybe_make_raw<span class="Delimiter">(</span>product<span class="Delimiter">,</span> caller<span class="Delimiter">);</span> +<span id="L262" class="LineNr">262 </span><span class="Delimiter">:(code)</span> +<span id="L263" class="LineNr">263 </span><span class="Normal">void</span> maybe_make_raw<span class="Delimiter">(</span>reagent& r<span class="Delimiter">,</span> <span class="Normal">const</span> recipe& caller<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L264" class="LineNr">264 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_special_name<span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L265" class="LineNr">265 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L74'>starts_with</a><span class="Delimiter">(</span>caller<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"scenario_"</span><span class="Delimiter">))</span> +<span id="L266" class="LineNr">266 </span> r<span class="Delimiter">.</span>properties<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>pair<string<span class="Delimiter">,</span> string_tree*><span class="Delimiter">(</span><span class="Constant">"raw"</span><span class="Delimiter">,</span> <span class="Constant">NULL</span><span class="Delimiter">));</span> +<span id="L267" class="LineNr">267 </span> <span class="Comment">// End maybe_make_raw</span> <span id="L268" class="LineNr">268 </span><span class="Delimiter">}</span> <span id="L269" class="LineNr">269 </span> -<span id="L270" class="LineNr">270 </span><span class="Comment">//: Watch out for redefinitions of scenario routines. We should never ever be</span> -<span id="L271" class="LineNr">271 </span><span class="Comment">//: doing that, regardless of anything else.</span> -<span id="L272" class="LineNr">272 </span><span class="Delimiter">:(scenarios run)</span> -<span id="L273" class="LineNr">273 </span><span class="Delimiter">:(scenario forbid_redefining_scenario_even_if_forced)</span> -<span id="L274" class="LineNr">274 </span><span class="Special">% Hide_errors = true;</span> -<span id="L275" class="LineNr">275 </span><span class="Special">% Disable_redefine_checks = true;</span> -<span id="L276" class="LineNr">276 </span><span class="muRecipe">def</span> scenario-foo [ -<span id="L277" class="LineNr">277 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> -<span id="L278" class="LineNr">278 </span>] -<span id="L279" class="LineNr">279 </span><span class="muRecipe">def</span> scenario-foo [ -<span id="L280" class="LineNr">280 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> -<span id="L281" class="LineNr">281 </span>] -<span id="L282" class="LineNr">282 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> scenario-foo</span> -<span id="L283" class="LineNr">283 </span> -<span id="L284" class="LineNr">284 </span><span class="Delimiter">:(scenario scenario_containing_parse_error)</span> -<span id="L285" class="LineNr">285 </span><span class="Special">% Hide_errors = true;</span> -<span id="L286" class="LineNr">286 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ -<span id="L287" class="LineNr">287 </span> memory-should-contain [ -<span id="L288" class="LineNr">288 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> -<span id="L289" class="LineNr">289 </span> <span class="Comment"># missing ']'</span> -<span id="L290" class="LineNr">290 </span>] -<span id="L291" class="LineNr">291 </span><span class="Comment"># no crash</span> -<span id="L292" class="LineNr">292 </span> -<span id="L293" class="LineNr">293 </span><span class="Delimiter">:(scenario scenario_containing_transform_error)</span> +<span id="L270" class="LineNr">270 </span><span class="Comment">//: Test.</span> +<span id="L271" class="LineNr">271 </span><span class="Delimiter">:(before "End <a href='042name.cc.html#L156'>is_special_name</a> Special-cases")</span> +<span id="L272" class="LineNr">272 </span><span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">"__maybe_make_raw_test__"</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L273" class="LineNr">273 </span><span class="Delimiter">:(before "End Special Scenario Variable Names(r)")</span> +<span id="L274" class="LineNr">274 </span><span class="Comment">//: ugly: we only need this for this one test, but need to define it for all time</span> +<span id="L275" class="LineNr">275 </span>Name[r][<span class="Constant">"__maybe_make_raw_test__"</span>] = Reserved_for_tests-<span class="Constant">1</span><span class="Delimiter">;</span> +<span id="L276" class="LineNr">276 </span><span class="Delimiter">:(code)</span> +<span id="L277" class="LineNr">277 </span><span class="Normal">void</span> test_maybe_make_raw<span class="Delimiter">()</span> <span class="Delimiter">{</span> +<span id="L278" class="LineNr">278 </span> <span class="Comment">// check that scenarios can use local-scope and special variables together</span> +<span id="L279" class="LineNr">279 </span> vector<recipe_ordinal> tmp = load<span class="Delimiter">(</span> +<span id="L280" class="LineNr">280 </span> <span class="Constant">"def scenario_foo [</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L281" class="LineNr">281 </span> <span class="Constant">" local-scope</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L282" class="LineNr">282 </span> <span class="Constant">" __maybe_make_raw_test__:num <- copy 34</span><span class="cSpecial">\n</span><span class="Constant">"</span> +<span id="L283" class="LineNr">283 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L284" class="LineNr">284 </span> mark_autogenerated<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> +<span id="L285" class="LineNr">285 </span> bind_special_scenario_names<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> +<span id="L286" class="LineNr">286 </span> <a href='012transform.cc.html#L46'>transform_all</a><span class="Delimiter">();</span> +<span id="L287" class="LineNr">287 </span> run<span class="Delimiter">(</span>tmp<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span> +<span id="L288" class="LineNr">288 </span> <a href='003trace.cc.html#L231'>CHECK_TRACE_DOESNT_CONTAIN_ERRORS</a><span class="Delimiter">();</span> +<span id="L289" class="LineNr">289 </span><span class="Delimiter">}</span> +<span id="L290" class="LineNr">290 </span> +<span id="L291" class="LineNr">291 </span><span class="Comment">//: Watch out for redefinitions of scenario routines. We should never ever be</span> +<span id="L292" class="LineNr">292 </span><span class="Comment">//: doing that, regardless of anything else.</span> +<span id="L293" class="LineNr">293 </span><span class="Delimiter">:(scenario forbid_redefining_scenario_even_if_forced)</span> <span id="L294" class="LineNr">294 </span><span class="Special">% Hide_errors = true;</span> -<span id="L295" class="LineNr">295 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L296" class="LineNr">296 </span> local-scope -<span id="L297" class="LineNr">297 </span> add x<span class="Delimiter">,</span> <span class="Constant">1</span> +<span id="L295" class="LineNr">295 </span><span class="Special">% Disable_redefine_checks = true;</span> +<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> scenario-foo [ +<span id="L297" class="LineNr">297 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">34</span> <span id="L298" class="LineNr">298 </span>] -<span id="L299" class="LineNr">299 </span><span class="Comment"># no crash</span> -<span id="L300" class="LineNr">300 </span> -<span id="L301" class="LineNr">301 </span><span class="Delimiter">:(after "bool should_check_for_redefine(const string& recipe_name)")</span> -<span id="L302" class="LineNr">302 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>recipe_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"scenario-"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L299" class="LineNr">299 </span><span class="muRecipe">def</span> scenario-foo [ +<span id="L300" class="LineNr">300 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">35</span> +<span id="L301" class="LineNr">301 </span>] +<span id="L302" class="LineNr">302 </span><span class="traceContains">+error: redefining <a href='010vm.cc.html#L19'>recipe</a> scenario-foo</span> <span id="L303" class="LineNr">303 </span> -<span id="L304" class="LineNr">304 </span><span class="SalientComment">//:: The special instructions we want to support inside scenarios.</span> -<span id="L305" class="LineNr">305 </span><span class="Comment">//: These are easy to support in an interpreter, but will require more work</span> -<span id="L306" class="LineNr">306 </span><span class="Comment">//: when we eventually build a compiler.</span> -<span id="L307" class="LineNr">307 </span> -<span id="L308" class="LineNr">308 </span><span class="Comment">//: 'run' is a purely lexical convenience to separate the code actually being</span> -<span id="L309" class="LineNr">309 </span><span class="Comment">//: tested from any setup or teardown</span> -<span id="L310" class="LineNr">310 </span> -<span id="L311" class="LineNr">311 </span><span class="Delimiter">:(scenario run)</span> -<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L313" class="LineNr">313 </span> run [ -<span id="L314" class="LineNr">314 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> -<span id="L315" class="LineNr">315 </span> ] -<span id="L316" class="LineNr">316 </span>] -<span id="L317" class="LineNr">317 </span><span class="traceContains">+mem: storing 13 in location 1</span> -<span id="L318" class="LineNr">318 </span> -<span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> -<span id="L320" class="LineNr">320 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"run"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L321" class="LineNr">321 </span> <span class="Comment">// Just inline all instructions inside the run block in the containing</span> -<span id="L322" class="LineNr">322 </span> <span class="Comment">// recipe. 'run' is basically a comment; pretend it doesn't exist.</span> -<span id="L323" class="LineNr">323 </span> istringstream in2<span class="Delimiter">(</span><span class="Constant">"[</span><span class="cSpecial">\n</span><span class="Constant">"</span>+curr<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="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L324" class="LineNr">324 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span> -<span id="L325" class="LineNr">325 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> -<span id="L326" class="LineNr">326 </span><span class="Delimiter">}</span> +<span id="L304" class="LineNr">304 </span><span class="Delimiter">:(scenario scenario_containing_parse_error)</span> +<span id="L305" class="LineNr">305 </span><span class="Special">% Hide_errors = true;</span> +<span id="L306" class="LineNr">306 </span><span class="muScenario"><a href='050scenario.cc.html#L57'>scenario</a></span> foo [ +<span id="L307" class="LineNr">307 </span> memory-should-contain [ +<span id="L308" class="LineNr">308 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> +<span id="L309" class="LineNr">309 </span> <span class="Comment"># missing ']'</span> +<span id="L310" class="LineNr">310 </span>] +<span id="L311" class="LineNr">311 </span><span class="Comment"># no crash</span> +<span id="L312" class="LineNr">312 </span> +<span id="L313" class="LineNr">313 </span><span class="Delimiter">:(scenario scenario_containing_transform_error)</span> +<span id="L314" class="LineNr">314 </span><span class="Special">% Hide_errors = true;</span> +<span id="L315" class="LineNr">315 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L316" class="LineNr">316 </span> local-scope +<span id="L317" class="LineNr">317 </span> add x<span class="Delimiter">,</span> <span class="Constant">1</span> +<span id="L318" class="LineNr">318 </span>] +<span id="L319" class="LineNr">319 </span><span class="Comment"># no crash</span> +<span id="L320" class="LineNr">320 </span> +<span id="L321" class="LineNr">321 </span><span class="Delimiter">:(after "bool should_check_for_redefine(const string& recipe_name)")</span> +<span id="L322" class="LineNr">322 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>recipe_name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">"scenario-"</span><span class="Delimiter">)</span> == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L323" class="LineNr">323 </span> +<span id="L324" class="LineNr">324 </span><span class="SalientComment">//:: The special instructions we want to support inside scenarios.</span> +<span id="L325" class="LineNr">325 </span><span class="Comment">//: These are easy to support in an interpreter, but will require more work</span> +<span id="L326" class="LineNr">326 </span><span class="Comment">//: when we eventually build a compiler.</span> <span id="L327" class="LineNr">327 </span> -<span id="L328" class="LineNr">328 </span><span class="Delimiter">:(scenario run_multiple)</span> -<span id="L329" class="LineNr">329 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L330" class="LineNr">330 </span> run [ -<span id="L331" class="LineNr">331 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> -<span id="L332" class="LineNr">332 </span> ] +<span id="L328" class="LineNr">328 </span><span class="Comment">//: 'run' is a purely lexical convenience to separate the code actually being</span> +<span id="L329" class="LineNr">329 </span><span class="Comment">//: tested from any setup or teardown</span> +<span id="L330" class="LineNr">330 </span> +<span id="L331" class="LineNr">331 </span><span class="Delimiter">:(scenario run)</span> +<span id="L332" class="LineNr">332 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ <span id="L333" class="LineNr">333 </span> run [ -<span id="L334" class="LineNr">334 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> +<span id="L334" class="LineNr">334 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> <span id="L335" class="LineNr">335 </span> ] <span id="L336" class="LineNr">336 </span>] <span id="L337" class="LineNr">337 </span><span class="traceContains">+mem: storing 13 in location 1</span> -<span id="L338" class="LineNr">338 </span><span class="traceContains">+mem: storing 13 in location 2</span> -<span id="L339" class="LineNr">339 </span> -<span id="L340" class="LineNr">340 </span><span class="Comment">//: 'memory-should-contain' raises errors if specific locations aren't as expected</span> -<span id="L341" class="LineNr">341 </span><span class="Comment">//: Also includes some special support for checking strings.</span> -<span id="L342" class="LineNr">342 </span> -<span id="L343" class="LineNr">343 </span><span class="Delimiter">:(before "End Globals")</span> -<span id="L344" class="LineNr">344 </span><span class="Normal">bool</span> Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L345" class="LineNr">345 </span><span class="Delimiter">:(before "End Setup")</span> -<span id="L346" class="LineNr">346 </span>Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L338" class="LineNr">338 </span> +<span id="L339" class="LineNr">339 </span><span class="Delimiter">:(before "End Rewrite Instruction(curr, <a href='010vm.cc.html#L19'>recipe</a> result)")</span> +<span id="L340" class="LineNr">340 </span><span class="Normal">if</span> <span class="Delimiter">(</span>curr<span class="Delimiter">.</span>name == <span class="Constant">"run"</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L341" class="LineNr">341 </span> <span class="Comment">// Just inline all instructions inside the run block in the containing</span> +<span id="L342" class="LineNr">342 </span> <span class="Comment">// recipe. 'run' is basically a comment; pretend it doesn't exist.</span> +<span id="L343" class="LineNr">343 </span> istringstream in2<span class="Delimiter">(</span><span class="Constant">"[</span><span class="cSpecial">\n</span><span class="Constant">"</span>+curr<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="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L344" class="LineNr">344 </span> <a href='011load.cc.html#L81'>slurp_body</a><span class="Delimiter">(</span>in2<span class="Delimiter">,</span> result<span class="Delimiter">);</span> +<span id="L345" class="LineNr">345 </span> curr<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span> <span id="L347" class="LineNr">347 </span> -<span id="L348" class="LineNr">348 </span><span class="Delimiter">:(scenario memory_check)</span> -<span id="L349" class="LineNr">349 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L350" class="LineNr">350 </span><span class="Special">% Hide_errors = true;</span> -<span id="L351" class="LineNr">351 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L352" class="LineNr">352 </span> memory-should-contain [ -<span id="L353" class="LineNr">353 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">13</span> -<span id="L354" class="LineNr">354 </span> ] -<span id="L355" class="LineNr">355 </span>] -<span id="L356" class="LineNr">356 </span><span class="traceContains">+run: checking location 1</span> -<span id="L357" class="LineNr">357 </span><span class="traceContains">+error: expected location '1' to contain 13 but saw 0</span> -<span id="L358" class="LineNr">358 </span> -<span id="L359" class="LineNr">359 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -<span id="L360" class="LineNr">360 </span>MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span> -<span id="L361" class="LineNr">361 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L362" class="LineNr">362 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"memory-should-contain"</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span> -<span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> -<span id="L364" class="LineNr">364 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <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><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -<span id="L368" class="LineNr">368 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span> -<span id="L369" class="LineNr">369 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L370" class="LineNr">370 </span> check_memory<span class="Delimiter">(</span>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>name<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 id="L374" class="LineNr">374 </span><span class="Delimiter">:(code)</span> -<span id="L375" class="LineNr">375 </span><span class="Normal">void</span> check_memory<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L376" class="LineNr">376 </span> istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span> -<span id="L377" class="LineNr">377 </span> in >> std::noskipws<span class="Delimiter">;</span> -<span id="L378" class="LineNr">378 </span> set<<span class="Normal">int</span>> locations_checked<span class="Delimiter">;</span> -<span id="L379" class="LineNr">379 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L380" class="LineNr">380 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L381" class="LineNr">381 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L382" class="LineNr">382 </span> string lhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L383" class="LineNr">383 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L384" class="LineNr">384 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L385" class="LineNr">385 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L386" class="LineNr">386 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L387" class="LineNr">387 </span> <span class="Delimiter">}</span> -<span id="L388" class="LineNr">388 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L389" class="LineNr">389 </span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span> -<span id="L390" class="LineNr">390 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L391" class="LineNr">391 </span> <span class="Delimiter">}</span> -<span id="L392" class="LineNr">392 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> -<span id="L393" class="LineNr">393 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L394" class="LineNr">394 </span> string _assign<span class="Delimiter">;</span> in >> _assign<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> -<span id="L395" class="LineNr">395 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L396" class="LineNr">396 </span> string rhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L397" class="LineNr">397 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L398" class="LineNr">398 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L399" class="LineNr">399 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L400" class="LineNr">400 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L401" class="LineNr">401 </span> <span class="Delimiter">}</span> -<span id="L402" class="LineNr">402 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>rhs<span class="Delimiter">)</span> && !is_noninteger<span class="Delimiter">(</span>rhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L403" class="LineNr">403 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L404" class="LineNr">404 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L405" class="LineNr">405 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L406" class="LineNr">406 </span> <span class="Normal">else</span> -<span id="L407" class="LineNr">407 </span> <span class="Comment">// just testing scenario support</span> -<span id="L408" class="LineNr">408 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> -<span id="L409" class="LineNr">409 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L410" class="LineNr">410 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L348" class="LineNr">348 </span><span class="Delimiter">:(scenario run_multiple)</span> +<span id="L349" class="LineNr">349 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L350" class="LineNr">350 </span> run [ +<span id="L351" class="LineNr">351 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> +<span id="L352" class="LineNr">352 </span> ] +<span id="L353" class="LineNr">353 </span> run [ +<span id="L354" class="LineNr">354 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">13</span> +<span id="L355" class="LineNr">355 </span> ] +<span id="L356" class="LineNr">356 </span>] +<span id="L357" class="LineNr">357 </span><span class="traceContains">+mem: storing 13 in location 1</span> +<span id="L358" class="LineNr">358 </span><span class="traceContains">+mem: storing 13 in location 2</span> +<span id="L359" class="LineNr">359 </span> +<span id="L360" class="LineNr">360 </span><span class="Comment">//: 'memory-should-contain' raises errors if specific locations aren't as expected</span> +<span id="L361" class="LineNr">361 </span><span class="Comment">//: Also includes some special support for checking strings.</span> +<span id="L362" class="LineNr">362 </span> +<span id="L363" class="LineNr">363 </span><span class="Delimiter">:(before "End Globals")</span> +<span id="L364" class="LineNr">364 </span><span class="Normal">bool</span> Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L365" class="LineNr">365 </span><span class="Delimiter">:(before "End Setup")</span> +<span id="L366" class="LineNr">366 </span>Scenario_testing_scenario = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L367" class="LineNr">367 </span> +<span id="L368" class="LineNr">368 </span><span class="Delimiter">:(scenario memory_check)</span> +<span id="L369" class="LineNr">369 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L370" class="LineNr">370 </span><span class="Special">% Hide_errors = true;</span> +<span id="L371" class="LineNr">371 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L372" class="LineNr">372 </span> memory-should-contain [ +<span id="L373" class="LineNr">373 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">13</span> +<span id="L374" class="LineNr">374 </span> ] +<span id="L375" class="LineNr">375 </span>] +<span id="L376" class="LineNr">376 </span><span class="traceContains">+run: checking location 1</span> +<span id="L377" class="LineNr">377 </span><span class="traceContains">+error: expected location '1' to contain 13 but saw 0</span> +<span id="L378" class="LineNr">378 </span> +<span id="L379" class="LineNr">379 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +<span id="L380" class="LineNr">380 </span>MEMORY_SHOULD_CONTAIN<span class="Delimiter">,</span> +<span id="L381" class="LineNr">381 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +<span id="L382" class="LineNr">382 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"memory-should-contain"</span><span class="Delimiter">,</span> MEMORY_SHOULD_CONTAIN<span class="Delimiter">);</span> +<span id="L383" class="LineNr">383 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> +<span id="L384" class="LineNr">384 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span> +<span id="L385" class="LineNr">385 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L386" class="LineNr">386 </span><span class="Delimiter">}</span> +<span id="L387" class="LineNr">387 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L388" class="LineNr">388 </span><span class="Normal">case</span> MEMORY_SHOULD_CONTAIN: <span class="Delimiter">{</span> +<span id="L389" class="LineNr">389 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L390" class="LineNr">390 </span> check_memory<span class="Delimiter">(</span>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>name<span class="Delimiter">);</span> +<span id="L391" class="LineNr">391 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L392" class="LineNr">392 </span><span class="Delimiter">}</span> +<span id="L393" class="LineNr">393 </span> +<span id="L394" class="LineNr">394 </span><span class="Delimiter">:(code)</span> +<span id="L395" class="LineNr">395 </span><span class="Normal">void</span> check_memory<span class="Delimiter">(</span><span class="Normal">const</span> string& s<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L396" class="LineNr">396 </span> istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span> +<span id="L397" class="LineNr">397 </span> in >> std::noskipws<span class="Delimiter">;</span> +<span id="L398" class="LineNr">398 </span> set<<span class="Normal">int</span>> locations_checked<span class="Delimiter">;</span> +<span id="L399" class="LineNr">399 </span> <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L400" class="LineNr">400 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L401" class="LineNr">401 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L402" class="LineNr">402 </span> string lhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L403" class="LineNr">403 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>lhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L404" class="LineNr">404 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L405" class="LineNr">405 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (0)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L406" class="LineNr">406 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L407" class="LineNr">407 </span> <span class="Delimiter">}</span> +<span id="L408" class="LineNr">408 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>lhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L409" class="LineNr">409 </span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span>lhs<span class="Delimiter">,</span> in<span class="Delimiter">);</span> +<span id="L410" class="LineNr">410 </span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L411" class="LineNr">411 </span> <span class="Delimiter">}</span> -<span id="L412" class="LineNr">412 </span> <span class="Normal">double</span> value = <a href='015literal_noninteger.cc.html#L26'>to_double</a><span class="Delimiter">(</span>rhs<span class="Delimiter">);</span> -<span id="L413" class="LineNr">413 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>locations_checked<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> -<span id="L414" class="LineNr">414 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"duplicate expectation for location '"</span> << address << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L415" class="LineNr">415 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L416" class="LineNr">416 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != value<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L417" class="LineNr">417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L418" class="LineNr">418 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L419" class="LineNr">419 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L420" class="LineNr">420 </span> <span class="Delimiter">}</span> -<span id="L421" class="LineNr">421 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L422" class="LineNr">422 </span> <span class="Comment">// just testing scenario support</span> -<span id="L423" class="LineNr">423 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L424" class="LineNr">424 </span> <span class="Delimiter">}</span> -<span id="L425" class="LineNr">425 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L426" class="LineNr">426 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L427" class="LineNr">427 </span> <span class="Delimiter">}</span> -<span id="L428" class="LineNr">428 </span> locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> -<span id="L429" class="LineNr">429 </span> <span class="Delimiter">}</span> -<span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span> -<span id="L431" class="LineNr">431 </span> -<span id="L432" class="LineNr">432 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span><span class="Normal">const</span> string& lhs<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L433" class="LineNr">433 </span> reagent x<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> -<span id="L434" class="LineNr">434 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> && is_mu_character<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span> -<span id="L435" class="LineNr">435 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span> -<span id="L436" class="LineNr">436 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L437" class="LineNr">437 </span> string _assign = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L438" class="LineNr">438 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_assign<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L439" class="LineNr">439 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L440" class="LineNr">440 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L441" class="LineNr">441 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L442" class="LineNr">442 </span> <span class="Delimiter">}</span> -<span id="L443" class="LineNr">443 </span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> -<span id="L444" class="LineNr">444 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L445" class="LineNr">445 </span> string literal = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L446" class="LineNr">446 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>literal<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L447" class="LineNr">447 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L448" class="LineNr">448 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L449" class="LineNr">449 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L450" class="LineNr">450 </span> <span class="Delimiter">}</span> -<span id="L451" class="LineNr">451 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span> -<span id="L452" class="LineNr">452 </span> <span class="Comment">// exclude quoting brackets</span> -<span id="L453" class="LineNr">453 </span> assert<span class="Delimiter">(</span>*literal<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>literal<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> -<span id="L454" class="LineNr">454 </span> assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> == <span class="Constant">']'</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> -<span id="L455" class="LineNr">455 </span> check_string<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> literal<span class="Delimiter">);</span> -<span id="L456" class="LineNr">456 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L457" class="LineNr">457 </span> <span class="Delimiter">}</span> -<span id="L458" class="LineNr">458 </span> <span class="Comment">// End Scenario Type Special-cases</span> -<span id="L459" class="LineNr">459 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"don't know how to check memory for '"</span> << lhs << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L460" class="LineNr">460 </span><span class="Delimiter">}</span> -<span id="L461" class="LineNr">461 </span> -<span id="L462" class="LineNr">462 </span><span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <span class="Normal">const</span> string& literal<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L463" class="LineNr">463 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking string length at "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L464" class="LineNr">464 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L465" class="LineNr">465 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L466" class="LineNr">466 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="Constant">" ("</span> << <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>address-<span class="Comment">/*</span><span class="Comment">fake refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L467" class="LineNr">467 </span> <span class="Normal">else</span> -<span id="L468" class="LineNr">468 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L469" class="LineNr">469 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L470" class="LineNr">470 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L471" class="LineNr">471 </span> <span class="Delimiter">}</span> -<span id="L472" class="LineNr">472 </span> ++address<span class="Delimiter">;</span> <span class="Comment">// now skip length</span> -<span id="L473" class="LineNr">473 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L474" class="LineNr">474 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L475" class="LineNr">475 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">)</span> != literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L476" class="LineNr">476 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L477" class="LineNr">477 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L478" class="LineNr">478 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">" ('"</span> << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L479" class="LineNr">479 </span> <span class="Delimiter">}</span> -<span id="L480" class="LineNr">480 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L481" class="LineNr">481 </span> <span class="Comment">// just testing scenario support</span> -<span id="L482" class="LineNr">482 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L483" class="LineNr">483 </span> <span class="Delimiter">}</span> -<span id="L484" class="LineNr">484 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L485" class="LineNr">485 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L486" class="LineNr">486 </span> <span class="Delimiter">}</span> -<span id="L487" class="LineNr">487 </span> <span class="Delimiter">}</span> -<span id="L488" class="LineNr">488 </span><span class="Delimiter">}</span> -<span id="L489" class="LineNr">489 </span> -<span id="L490" class="LineNr">490 </span><span class="Delimiter">:(scenario memory_check_multiple)</span> -<span id="L491" class="LineNr">491 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L492" class="LineNr">492 </span><span class="Special">% Hide_errors = true;</span> -<span id="L493" class="LineNr">493 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L494" class="LineNr">494 </span> memory-should-contain [ -<span id="L495" class="LineNr">495 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> -<span id="L496" class="LineNr">496 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> -<span id="L497" class="LineNr">497 </span> ] -<span id="L498" class="LineNr">498 </span>] -<span id="L499" class="LineNr">499 </span><span class="traceContains">+error: duplicate expectation for location '1'</span> -<span id="L500" class="LineNr">500 </span> -<span id="L501" class="LineNr">501 </span><span class="Delimiter">:(scenario memory_check_string_length)</span> -<span id="L502" class="LineNr">502 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L503" class="LineNr">503 </span><span class="Special">% Hide_errors = true;</span> -<span id="L504" class="LineNr">504 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L505" class="LineNr">505 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> -<span id="L506" class="LineNr">506 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> -<span id="L507" class="LineNr">507 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> -<span id="L508" class="LineNr">508 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">99</span> <span class="Comment"># 'c'</span> -<span id="L509" class="LineNr">509 </span> memory-should-contain [ -<span id="L510" class="LineNr">510 </span> <span class="Constant">1</span>:array:character<span class="Special"> <- </span>[ab] -<span id="L511" class="LineNr">511 </span> ] -<span id="L512" class="LineNr">512 </span>] -<span id="L513" class="LineNr">513 </span><span class="traceContains">+error: expected location '1' to contain length 2 of string [ab] but saw 3</span> -<span id="L514" class="LineNr">514 </span> -<span id="L515" class="LineNr">515 </span><span class="Delimiter">:(scenario memory_check_string)</span> -<span id="L516" class="LineNr">516 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L517" class="LineNr">517 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> -<span id="L518" class="LineNr">518 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> -<span id="L519" class="LineNr">519 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> -<span id="L520" class="LineNr">520 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">99</span> <span class="Comment"># 'c'</span> -<span id="L521" class="LineNr">521 </span> memory-should-contain [ -<span id="L522" class="LineNr">522 </span> <span class="Constant">1</span>:array:character<span class="Special"> <- </span>[abc] -<span id="L523" class="LineNr">523 </span> ] -<span id="L524" class="LineNr">524 </span>] -<span id="L525" class="LineNr">525 </span><span class="traceContains">+run: checking string length at 1</span> -<span id="L526" class="LineNr">526 </span><span class="traceContains">+run: checking location 2</span> -<span id="L527" class="LineNr">527 </span><span class="traceContains">+run: checking location 3</span> -<span id="L528" class="LineNr">528 </span><span class="traceContains">+run: checking location 4</span> -<span id="L529" class="LineNr">529 </span> -<span id="L530" class="LineNr">530 </span><span class="Delimiter">:(scenario memory_invalid_string_check)</span> -<span id="L531" class="LineNr">531 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L532" class="LineNr">532 </span><span class="Special">% Hide_errors = true;</span> -<span id="L533" class="LineNr">533 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L534" class="LineNr">534 </span> memory-should-contain [ -<span id="L535" class="LineNr">535 </span> <span class="Constant">1</span><span class="Special"> <- </span>[abc] -<span id="L536" class="LineNr">536 </span> ] -<span id="L537" class="LineNr">537 </span>] -<span id="L538" class="LineNr">538 </span><span class="traceContains">+error: location '1' can't contain non-number [abc]</span> -<span id="L539" class="LineNr">539 </span> -<span id="L540" class="LineNr">540 </span><span class="Delimiter">:(scenario memory_check_with_comment)</span> -<span id="L541" class="LineNr">541 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L542" class="LineNr">542 </span><span class="Special">% Hide_errors = true;</span> -<span id="L543" class="LineNr">543 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L544" class="LineNr">544 </span> memory-should-contain [ -<span id="L545" class="LineNr">545 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">34</span> <span class="Comment"># comment</span> -<span id="L546" class="LineNr">546 </span> ] -<span id="L547" class="LineNr">547 </span>] -<span id="L548" class="LineNr">548 </span><span class="traceAbsent">-error: location 1 can't contain non-number 34 # comment</span> -<span id="L549" class="LineNr">549 </span><span class="Comment"># but there'll be an error signalled by memory-should-contain</span> -<span id="L550" class="LineNr">550 </span> -<span id="L551" class="LineNr">551 </span><span class="Comment">//: 'trace-should-contain' is like the '+' lines in our scenarios so far</span> -<span id="L552" class="LineNr">552 </span><span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span> -<span id="L553" class="LineNr">553 </span><span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span> -<span id="L554" class="LineNr">554 </span><span class="Comment">// other lines in between.)</span> -<span id="L555" class="LineNr">555 </span> -<span id="L556" class="LineNr">556 </span><span class="Delimiter">:(scenario trace_check_fails)</span> -<span id="L557" class="LineNr">557 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L558" class="LineNr">558 </span><span class="Special">% Hide_errors = true;</span> -<span id="L559" class="LineNr">559 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L560" class="LineNr">560 </span> trace-should-contain [ -<span id="L561" class="LineNr">561 </span> <span class="Normal">a</span>: b -<span id="L562" class="LineNr">562 </span> <span class="Normal">a</span>: d -<span id="L563" class="LineNr">563 </span> ] -<span id="L564" class="LineNr">564 </span>] -<span id="L565" class="LineNr">565 </span><span class="traceContains">+error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L566" class="LineNr">566 </span> -<span id="L567" class="LineNr">567 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -<span id="L568" class="LineNr">568 </span>TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span> -<span id="L569" class="LineNr">569 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L570" class="LineNr">570 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span> -<span id="L571" class="LineNr">571 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> -<span id="L572" class="LineNr">572 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> -<span id="L573" class="LineNr">573 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L574" class="LineNr">574 </span><span class="Delimiter">}</span> -<span id="L575" class="LineNr">575 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -<span id="L576" class="LineNr">576 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> -<span id="L577" class="LineNr">577 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L578" class="LineNr">578 </span> check_trace<span class="Delimiter">(</span>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>name<span class="Delimiter">);</span> -<span id="L579" class="LineNr">579 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L580" class="LineNr">580 </span><span class="Delimiter">}</span> -<span id="L581" class="LineNr">581 </span> -<span id="L582" class="LineNr">582 </span><span class="Delimiter">:(code)</span> -<span id="L583" class="LineNr">583 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> -<span id="L584" class="LineNr">584 </span><span class="Comment">// than just printing to stderr</span> -<span id="L585" class="LineNr">585 </span><span class="Normal">void</span> check_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L586" class="LineNr">586 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> -<span id="L587" class="LineNr">587 </span> vector<trace_line> expected_lines = parse_trace<span class="Delimiter">(</span>expected<span class="Delimiter">);</span> -<span id="L588" class="LineNr">588 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L589" class="LineNr">589 </span> <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span> -<span id="L590" class="LineNr">590 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L591" class="LineNr">591 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label != p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L592" class="LineNr">592 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents != <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L593" class="LineNr">593 </span> <span class="Comment">// match</span> -<span id="L594" class="LineNr">594 </span> ++curr_expected_line<span class="Delimiter">;</span> -<span id="L595" class="LineNr">595 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L596" class="LineNr">596 </span> <span class="Delimiter">}</span> -<span id="L597" class="LineNr">597 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> -<span id="L598" class="LineNr">598 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> -<span id="L599" class="LineNr">599 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L600" class="LineNr">600 </span> <span class="Normal">else</span> -<span id="L601" class="LineNr">601 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> -<span id="L602" class="LineNr">602 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L603" class="LineNr">603 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span> -<span id="L604" class="LineNr">604 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label<span class="Delimiter">);</span> -<span id="L605" class="LineNr">605 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L606" class="LineNr">606 </span><span class="Delimiter">}</span> -<span id="L607" class="LineNr">607 </span> -<span id="L608" class="LineNr">608 </span>vector<trace_line> parse_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L609" class="LineNr">609 </span> vector<string> buf = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> -<span id="L610" class="LineNr">610 </span> vector<trace_line> result<span class="Delimiter">;</span> -<span id="L611" class="LineNr">611 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>buf<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L612" class="LineNr">612 </span> buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> -<span id="L613" class="LineNr">613 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L614" class="LineNr">614 </span> <span class="Normal">int</span> delim = buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>find<span class="Delimiter">(</span><span class="Constant">": "</span><span class="Delimiter">);</span> -<span id="L615" class="LineNr">615 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>delim == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L616" class="LineNr">616 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": lines in 'trace-should-contain' should be of the form <label>: <contents>. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L617" class="LineNr">617 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> -<span id="L618" class="LineNr">618 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L619" class="LineNr">619 </span> <span class="Delimiter">}</span> -<span id="L620" class="LineNr">620 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> delim<span class="Delimiter">)),</span> <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span>delim+<span class="Constant">2</span><span class="Delimiter">))));</span> -<span id="L621" class="LineNr">621 </span> <span class="Delimiter">}</span> -<span id="L622" class="LineNr">622 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> -<span id="L623" class="LineNr">623 </span><span class="Delimiter">}</span> -<span id="L624" class="LineNr">624 </span> -<span id="L625" class="LineNr">625 </span><span class="Delimiter">:(scenario trace_check_fails_in_nonfirst_line)</span> -<span id="L626" class="LineNr">626 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L627" class="LineNr">627 </span><span class="Special">% Hide_errors = true;</span> -<span id="L628" class="LineNr">628 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L629" class="LineNr">629 </span> run [ -<span id="L630" class="LineNr">630 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] -<span id="L631" class="LineNr">631 </span> ] -<span id="L632" class="LineNr">632 </span> trace-should-contain [ -<span id="L633" class="LineNr">633 </span> <span class="Normal">a</span>: b -<span id="L634" class="LineNr">634 </span> <span class="Normal">a</span>: d -<span id="L635" class="LineNr">635 </span> ] -<span id="L636" class="LineNr">636 </span>] -<span id="L637" class="LineNr">637 </span><span class="traceContains">+error: missing [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L638" class="LineNr">638 </span> -<span id="L639" class="LineNr">639 </span><span class="Delimiter">:(scenario trace_check_passes_silently)</span> -<span id="L640" class="LineNr">640 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L641" class="LineNr">641 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L642" class="LineNr">642 </span> run [ -<span id="L643" class="LineNr">643 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] -<span id="L644" class="LineNr">644 </span> ] -<span id="L645" class="LineNr">645 </span> trace-should-contain [ -<span id="L646" class="LineNr">646 </span> <span class="Normal">a</span>: b -<span id="L647" class="LineNr">647 </span> ] -<span id="L648" class="LineNr">648 </span>] -<span id="L649" class="LineNr">649 </span><span class="traceAbsent">-error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L650" class="LineNr">650 </span>$error: <span class="Constant">0</span> -<span id="L651" class="LineNr">651 </span> -<span id="L652" class="LineNr">652 </span><span class="Comment">//: 'trace-should-not-contain' is like the '-' lines in our scenarios so far</span> -<span id="L653" class="LineNr">653 </span><span class="Comment">//: Each trace line is separately checked for absense. Order is *not*</span> -<span id="L654" class="LineNr">654 </span><span class="Comment">//: important, so you can't say things like "B should not exist after A."</span> -<span id="L655" class="LineNr">655 </span> -<span id="L656" class="LineNr">656 </span><span class="Delimiter">:(scenario trace_negative_check_fails)</span> -<span id="L657" class="LineNr">657 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L658" class="LineNr">658 </span><span class="Special">% Hide_errors = true;</span> -<span id="L659" class="LineNr">659 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L660" class="LineNr">660 </span> run [ -<span id="L661" class="LineNr">661 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] -<span id="L662" class="LineNr">662 </span> ] -<span id="L663" class="LineNr">663 </span> trace-should-<span class="Normal">not</span>-contain [ -<span id="L664" class="LineNr">664 </span> <span class="Normal">a</span>: b -<span id="L665" class="LineNr">665 </span> ] -<span id="L666" class="LineNr">666 </span>] -<span id="L667" class="LineNr">667 </span><span class="traceContains">+error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L668" class="LineNr">668 </span> -<span id="L669" class="LineNr">669 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -<span id="L670" class="LineNr">670 </span>TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span> -<span id="L671" class="LineNr">671 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L672" class="LineNr">672 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-not-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span> -<span id="L673" class="LineNr">673 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> -<span id="L674" class="LineNr">674 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> -<span id="L675" class="LineNr">675 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L676" class="LineNr">676 </span><span class="Delimiter">}</span> -<span id="L677" class="LineNr">677 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -<span id="L678" class="LineNr">678 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> -<span id="L679" class="LineNr">679 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L680" class="LineNr">680 </span> check_trace_missing<span class="Delimiter">(</span>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>name<span class="Delimiter">);</span> -<span id="L681" class="LineNr">681 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L682" class="LineNr">682 </span><span class="Delimiter">}</span> -<span id="L683" class="LineNr">683 </span> -<span id="L684" class="LineNr">684 </span><span class="Delimiter">:(code)</span> -<span id="L685" class="LineNr">685 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> -<span id="L686" class="LineNr">686 </span><span class="Comment">// than just printing to stderr</span> -<span id="L687" class="LineNr">687 </span><span class="Normal">bool</span> check_trace_missing<span class="Delimiter">(</span><span class="Normal">const</span> string& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L688" class="LineNr">688 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> -<span id="L689" class="LineNr">689 </span> vector<trace_line> lines = parse_trace<span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L690" class="LineNr">690 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L691" class="LineNr">691 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span>lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label<span class="Delimiter">,</span> lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L692" class="LineNr">692 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unexpected ["</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents << <span class="Constant">"] in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L693" class="LineNr">693 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L694" class="LineNr">694 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L695" class="LineNr">695 </span> <span class="Delimiter">}</span> -<span id="L696" class="LineNr">696 </span> <span class="Delimiter">}</span> -<span id="L697" class="LineNr">697 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L698" class="LineNr">698 </span><span class="Delimiter">}</span> -<span id="L699" class="LineNr">699 </span> -<span id="L700" class="LineNr">700 </span><span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span> -<span id="L701" class="LineNr">701 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L702" class="LineNr">702 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L703" class="LineNr">703 </span> trace-should-<span class="Normal">not</span>-contain [ -<span id="L704" class="LineNr">704 </span> <span class="Normal">a</span>: b -<span id="L705" class="LineNr">705 </span> ] -<span id="L706" class="LineNr">706 </span>] -<span id="L707" class="LineNr">707 </span><span class="traceAbsent">-error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L708" class="LineNr">708 </span>$error: <span class="Constant">0</span> -<span id="L709" class="LineNr">709 </span> -<span id="L710" class="LineNr">710 </span><span class="Delimiter">:(scenario trace_negative_check_fails_on_any_unexpected_line)</span> -<span id="L711" class="LineNr">711 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L712" class="LineNr">712 </span><span class="Special">% Hide_errors = true;</span> -<span id="L713" class="LineNr">713 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L714" class="LineNr">714 </span> run [ -<span id="L715" class="LineNr">715 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d] -<span id="L716" class="LineNr">716 </span> ] -<span id="L717" class="LineNr">717 </span> trace-should-<span class="Normal">not</span>-contain [ -<span id="L718" class="LineNr">718 </span> <span class="Normal">a</span>: b -<span id="L719" class="LineNr">719 </span> <span class="Normal">a</span>: d -<span id="L720" class="LineNr">720 </span> ] -<span id="L721" class="LineNr">721 </span>] -<span id="L722" class="LineNr">722 </span><span class="traceContains">+error: unexpected [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> -<span id="L723" class="LineNr">723 </span> -<span id="L724" class="LineNr">724 </span><span class="Delimiter">:(scenario trace_count_check)</span> -<span id="L725" class="LineNr">725 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L726" class="LineNr">726 </span> run [ -<span id="L727" class="LineNr">727 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] -<span id="L728" class="LineNr">728 </span> ] -<span id="L729" class="LineNr">729 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">1</span><span class="Delimiter">,</span> [a] -<span id="L730" class="LineNr">730 </span>] -<span id="L731" class="LineNr">731 </span><span class="Comment"># checks are inside scenario</span> -<span id="L732" class="LineNr">732 </span> -<span id="L733" class="LineNr">733 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> -<span id="L734" class="LineNr">734 </span>CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">,</span> -<span id="L735" class="LineNr">735 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> -<span id="L736" class="LineNr">736 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-trace-count-for-label"</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span> -<span id="L737" class="LineNr">737 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> -<span id="L738" class="LineNr">738 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span> -<span id="L739" class="LineNr">739 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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="L740" class="LineNr">740 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'check-trace-count-for-label' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L741" class="LineNr">741 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L742" class="LineNr">742 </span> <span class="Delimiter">}</span> -<span id="L743" class="LineNr">743 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>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="Delimiter">{</span> -<span id="L744" class="LineNr">744 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'check-trace-count-for-label' should be a number (count), but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L745" class="LineNr">745 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L746" class="LineNr">746 </span> <span class="Delimiter">}</span> -<span id="L747" class="LineNr">747 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal_text<span class="Delimiter">(</span>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 class="Delimiter">{</span> -<span id="L748" class="LineNr">748 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L749" class="LineNr">749 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L750" class="LineNr">750 </span> <span class="Delimiter">}</span> -<span id="L751" class="LineNr">751 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L752" class="LineNr">752 </span><span class="Delimiter">}</span> -<span id="L753" class="LineNr">753 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> -<span id="L754" class="LineNr">754 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span> -<span id="L755" class="LineNr">755 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L756" class="LineNr">756 </span> <span class="Normal">int</span> expected_count = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> -<span id="L757" class="LineNr">757 </span> string label = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span> -<span id="L758" class="LineNr">758 </span> <span class="Normal">int</span> count = trace_count<span class="Delimiter">(</span>label<span class="Delimiter">);</span> -<span id="L759" class="LineNr">759 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count != expected_count<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L760" class="LineNr">760 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L761" class="LineNr">761 </span> <span class="Comment">// genuine test in a .mu file</span> -<span id="L762" class="LineNr">762 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": "</span> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a>: "</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L763" class="LineNr">763 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> -<span id="L764" class="LineNr">764 </span> <span class="Delimiter">}</span> -<span id="L765" class="LineNr">765 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> -<span id="L766" class="LineNr">766 </span> <span class="Comment">// just testing scenario support</span> -<span id="L767" class="LineNr">767 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L768" class="LineNr">768 </span> <span class="Delimiter">}</span> -<span id="L769" class="LineNr">769 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L412" class="LineNr">412 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = <a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> +<span id="L413" class="LineNr">413 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L414" class="LineNr">414 </span> string _assign<span class="Delimiter">;</span> in >> _assign<span class="Delimiter">;</span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> +<span id="L415" class="LineNr">415 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L416" class="LineNr">416 </span> string rhs = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L417" class="LineNr">417 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>rhs<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L418" class="LineNr">418 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L419" class="LineNr">419 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (1)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L420" class="LineNr">420 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L421" class="LineNr">421 </span> <span class="Delimiter">}</span> +<span id="L422" class="LineNr">422 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_integer<span class="Delimiter">(</span>rhs<span class="Delimiter">)</span> && !is_noninteger<span class="Delimiter">(</span>rhs<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L423" class="LineNr">423 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> +<span id="L424" class="LineNr">424 </span> <span class="Comment">// genuine test in a .mu file</span> +<span id="L425" class="LineNr">425 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L426" class="LineNr">426 </span> <span class="Normal">else</span> +<span id="L427" class="LineNr">427 </span> <span class="Comment">// just testing scenario support</span> +<span id="L428" class="LineNr">428 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"location '"</span> << address << <span class="Constant">"' can't contain non-number "</span> << rhs << <span class="cSpecial">'\n'</span> << end<span class="Delimiter">();</span> +<span id="L429" class="LineNr">429 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L430" class="LineNr">430 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L431" class="LineNr">431 </span> <span class="Delimiter">}</span> +<span id="L432" class="LineNr">432 </span> <span class="Normal">double</span> value = <a href='015literal_noninteger.cc.html#L26'>to_double</a><span class="Delimiter">(</span>rhs<span class="Delimiter">);</span> +<span id="L433" class="LineNr">433 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>contains_key<span class="Delimiter">(</span>locations_checked<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> +<span id="L434" class="LineNr">434 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"duplicate expectation for location '"</span> << address << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L435" class="LineNr">435 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L436" class="LineNr">436 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != value<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L437" class="LineNr">437 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L438" class="LineNr">438 </span> <span class="Comment">// genuine test in a .mu file</span> +<span id="L439" class="LineNr">439 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L440" class="LineNr">440 </span> <span class="Delimiter">}</span> +<span id="L441" class="LineNr">441 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> +<span id="L442" class="LineNr">442 </span> <span class="Comment">// just testing scenario support</span> +<span id="L443" class="LineNr">443 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain "</span> << no_scientific<span class="Delimiter">(</span>value<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L444" class="LineNr">444 </span> <span class="Delimiter">}</span> +<span id="L445" class="LineNr">445 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L446" class="LineNr">446 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L447" class="LineNr">447 </span> <span class="Delimiter">}</span> +<span id="L448" class="LineNr">448 </span> locations_checked<span class="Delimiter">.</span>insert<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">);</span> +<span id="L449" class="LineNr">449 </span> <span class="Delimiter">}</span> +<span id="L450" class="LineNr">450 </span><span class="Delimiter">}</span> +<span id="L451" class="LineNr">451 </span> +<span id="L452" class="LineNr">452 </span><span class="Normal">void</span> <a href='047check_type_by_name.cc.html#L49'>check_type</a><span class="Delimiter">(</span><span class="Normal">const</span> string& lhs<span class="Delimiter">,</span> istream& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L453" class="LineNr">453 </span> reagent x<span class="Delimiter">(</span>lhs<span class="Delimiter">);</span> +<span id="L454" class="LineNr">454 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_mu_array<span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)</span> && is_mu_character<span class="Delimiter">(</span><a href='032array.cc.html#L370'>array_element</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>type<span class="Delimiter">)))</span> <span class="Delimiter">{</span> +<span id="L455" class="LineNr">455 </span> x<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span><a href='002test.cc.html#L92'>to_integer</a><span class="Delimiter">(</span>x<span class="Delimiter">.</span>name<span class="Delimiter">));</span> +<span id="L456" class="LineNr">456 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L457" class="LineNr">457 </span> string _assign = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L458" class="LineNr">458 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_assign<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L459" class="LineNr">459 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L460" class="LineNr">460 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (2)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L461" class="LineNr">461 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L462" class="LineNr">462 </span> <span class="Delimiter">}</span> +<span id="L463" class="LineNr">463 </span> assert<span class="Delimiter">(</span>_assign == <span class="Constant">"<-"</span><span class="Delimiter">);</span> +<span id="L464" class="LineNr">464 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L465" class="LineNr">465 </span> string literal = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L466" class="LineNr">466 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>literal<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L467" class="LineNr">467 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L468" class="LineNr">468 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"incomplete 'memory-should-contain' block at <a href='003trace.cc.html#L195'>end</a> of file (3)</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L469" class="LineNr">469 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L470" class="LineNr">470 </span> <span class="Delimiter">}</span> +<span id="L471" class="LineNr">471 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = x<span class="Delimiter">.</span>value<span class="Delimiter">;</span> +<span id="L472" class="LineNr">472 </span> <span class="Comment">// exclude quoting brackets</span> +<span id="L473" class="LineNr">473 </span> assert<span class="Delimiter">(</span>*literal<span class="Delimiter">.</span>begin<span class="Delimiter">()</span> == <span class="Constant">'['</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>literal<span class="Delimiter">.</span>begin<span class="Delimiter">());</span> +<span id="L474" class="LineNr">474 </span> assert<span class="Delimiter">(</span>*--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">()</span> == <span class="Constant">']'</span><span class="Delimiter">);</span> literal<span class="Delimiter">.</span>erase<span class="Delimiter">(</span>--literal<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">());</span> +<span id="L475" class="LineNr">475 </span> check_string<span class="Delimiter">(</span><a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> literal<span class="Delimiter">);</span> +<span id="L476" class="LineNr">476 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L477" class="LineNr">477 </span> <span class="Delimiter">}</span> +<span id="L478" class="LineNr">478 </span> <span class="Comment">// End Scenario Type Special-cases</span> +<span id="L479" class="LineNr">479 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"don't know how to check memory for '"</span> << lhs << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L480" class="LineNr">480 </span><span class="Delimiter">}</span> +<span id="L481" class="LineNr">481 </span> +<span id="L482" class="LineNr">482 </span><span class="Normal">void</span> check_string<span class="Delimiter">(</span><span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">,</span> <span class="Normal">const</span> string& literal<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L483" class="LineNr">483 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking string length at "</span> << <a href='043space.cc.html#L76'>address</a> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L484" class="LineNr">484 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">)</span> != <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L485" class="LineNr">485 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> +<span id="L486" class="LineNr">486 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="Constant">" ("</span> << <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>address-<span class="Comment">/*</span><span class="Comment">fake refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">)</span> << <span class="Constant">")</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L487" class="LineNr">487 </span> <span class="Normal">else</span> +<span id="L488" class="LineNr">488 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location '"</span> << address << <span class="Constant">"' to contain length "</span> << <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">)</span> << <span class="Constant">" of string ["</span> << literal << <span class="Constant">"] but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> <a href='043space.cc.html#L76'>address</a><span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L489" class="LineNr">489 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L490" class="LineNr">490 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L491" class="LineNr">491 </span> <span class="Delimiter">}</span> +<span id="L492" class="LineNr">492 </span> ++address<span class="Delimiter">;</span> <span class="Comment">// now skip length</span> +<span id="L493" class="LineNr">493 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>literal<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L494" class="LineNr">494 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"checking location "</span> << address+i << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L495" class="LineNr">495 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">)</span> != literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L496" class="LineNr">496 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L497" class="LineNr">497 </span> <span class="Comment">// genuine test in a .mu file</span> +<span id="L498" class="LineNr">498 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">" ('"</span> << <span class="Normal">static_cast</span><<span class="Normal">char</span>><span class="Delimiter">(</span>get_or_insert<span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="Constant">"')</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L499" class="LineNr">499 </span> <span class="Delimiter">}</span> +<span id="L500" class="LineNr">500 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> +<span id="L501" class="LineNr">501 </span> <span class="Comment">// just testing scenario support</span> +<span id="L502" class="LineNr">502 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"expected location "</span> << <span class="Delimiter">(</span>address+i<span class="Delimiter">)</span> << <span class="Constant">" to contain "</span> << literal<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> << <span class="Constant">" but saw "</span> << no_scientific<span class="Delimiter">(</span><a href='001help.cc.html#L225'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address+i<span class="Delimiter">))</span> << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L503" class="LineNr">503 </span> <span class="Delimiter">}</span> +<span id="L504" class="LineNr">504 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L505" class="LineNr">505 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L506" class="LineNr">506 </span> <span class="Delimiter">}</span> +<span id="L507" class="LineNr">507 </span> <span class="Delimiter">}</span> +<span id="L508" class="LineNr">508 </span><span class="Delimiter">}</span> +<span id="L509" class="LineNr">509 </span> +<span id="L510" class="LineNr">510 </span><span class="Delimiter">:(scenario memory_check_multiple)</span> +<span id="L511" class="LineNr">511 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L512" class="LineNr">512 </span><span class="Special">% Hide_errors = true;</span> +<span id="L513" class="LineNr">513 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L514" class="LineNr">514 </span> memory-should-contain [ +<span id="L515" class="LineNr">515 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> +<span id="L516" class="LineNr">516 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">0</span> +<span id="L517" class="LineNr">517 </span> ] +<span id="L518" class="LineNr">518 </span>] +<span id="L519" class="LineNr">519 </span><span class="traceContains">+error: duplicate expectation for location '1'</span> +<span id="L520" class="LineNr">520 </span> +<span id="L521" class="LineNr">521 </span><span class="Delimiter">:(scenario memory_check_string_length)</span> +<span id="L522" class="LineNr">522 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L523" class="LineNr">523 </span><span class="Special">% Hide_errors = true;</span> +<span id="L524" class="LineNr">524 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L525" class="LineNr">525 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> +<span id="L526" class="LineNr">526 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> +<span id="L527" class="LineNr">527 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> +<span id="L528" class="LineNr">528 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">99</span> <span class="Comment"># 'c'</span> +<span id="L529" class="LineNr">529 </span> memory-should-contain [ +<span id="L530" class="LineNr">530 </span> <span class="Constant">1</span>:array:character<span class="Special"> <- </span>[ab] +<span id="L531" class="LineNr">531 </span> ] +<span id="L532" class="LineNr">532 </span>] +<span id="L533" class="LineNr">533 </span><span class="traceContains">+error: expected location '1' to contain length 2 of string [ab] but saw 3</span> +<span id="L534" class="LineNr">534 </span> +<span id="L535" class="LineNr">535 </span><span class="Delimiter">:(scenario memory_check_string)</span> +<span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L537" class="LineNr">537 </span> <span class="Constant">1</span>:num<span class="Special"> <- </span>copy <span class="Constant">3</span> +<span id="L538" class="LineNr">538 </span> <span class="Constant">2</span>:num<span class="Special"> <- </span>copy <span class="Constant">97</span> <span class="Comment"># 'a'</span> +<span id="L539" class="LineNr">539 </span> <span class="Constant">3</span>:num<span class="Special"> <- </span>copy <span class="Constant">98</span> <span class="Comment"># 'b'</span> +<span id="L540" class="LineNr">540 </span> <span class="Constant">4</span>:num<span class="Special"> <- </span>copy <span class="Constant">99</span> <span class="Comment"># 'c'</span> +<span id="L541" class="LineNr">541 </span> memory-should-contain [ +<span id="L542" class="LineNr">542 </span> <span class="Constant">1</span>:array:character<span class="Special"> <- </span>[abc] +<span id="L543" class="LineNr">543 </span> ] +<span id="L544" class="LineNr">544 </span>] +<span id="L545" class="LineNr">545 </span><span class="traceContains">+run: checking string length at 1</span> +<span id="L546" class="LineNr">546 </span><span class="traceContains">+run: checking location 2</span> +<span id="L547" class="LineNr">547 </span><span class="traceContains">+run: checking location 3</span> +<span id="L548" class="LineNr">548 </span><span class="traceContains">+run: checking location 4</span> +<span id="L549" class="LineNr">549 </span> +<span id="L550" class="LineNr">550 </span><span class="Delimiter">:(scenario memory_invalid_string_check)</span> +<span id="L551" class="LineNr">551 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L552" class="LineNr">552 </span><span class="Special">% Hide_errors = true;</span> +<span id="L553" class="LineNr">553 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L554" class="LineNr">554 </span> memory-should-contain [ +<span id="L555" class="LineNr">555 </span> <span class="Constant">1</span><span class="Special"> <- </span>[abc] +<span id="L556" class="LineNr">556 </span> ] +<span id="L557" class="LineNr">557 </span>] +<span id="L558" class="LineNr">558 </span><span class="traceContains">+error: location '1' can't contain non-number [abc]</span> +<span id="L559" class="LineNr">559 </span> +<span id="L560" class="LineNr">560 </span><span class="Delimiter">:(scenario memory_check_with_comment)</span> +<span id="L561" class="LineNr">561 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L562" class="LineNr">562 </span><span class="Special">% Hide_errors = true;</span> +<span id="L563" class="LineNr">563 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L564" class="LineNr">564 </span> memory-should-contain [ +<span id="L565" class="LineNr">565 </span> <span class="Constant">1</span><span class="Special"> <- </span><span class="Constant">34</span> <span class="Comment"># comment</span> +<span id="L566" class="LineNr">566 </span> ] +<span id="L567" class="LineNr">567 </span>] +<span id="L568" class="LineNr">568 </span><span class="traceAbsent">-error: location 1 can't contain non-number 34 # comment</span> +<span id="L569" class="LineNr">569 </span><span class="Comment"># but there'll be an error signalled by memory-should-contain</span> +<span id="L570" class="LineNr">570 </span> +<span id="L571" class="LineNr">571 </span><span class="Comment">//: 'trace-should-contain' is like the '+' lines in our scenarios so far</span> +<span id="L572" class="LineNr">572 </span><span class="Comment">// Like runs of contiguous '+' lines, order is important. The trace checks</span> +<span id="L573" class="LineNr">573 </span><span class="Comment">// that the lines are present *and* in the specified sequence. (There can be</span> +<span id="L574" class="LineNr">574 </span><span class="Comment">// other lines in between.)</span> +<span id="L575" class="LineNr">575 </span> +<span id="L576" class="LineNr">576 </span><span class="Delimiter">:(scenario trace_check_fails)</span> +<span id="L577" class="LineNr">577 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L578" class="LineNr">578 </span><span class="Special">% Hide_errors = true;</span> +<span id="L579" class="LineNr">579 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L580" class="LineNr">580 </span> trace-should-contain [ +<span id="L581" class="LineNr">581 </span> <span class="Normal">a</span>: b +<span id="L582" class="LineNr">582 </span> <span class="Normal">a</span>: d +<span id="L583" class="LineNr">583 </span> ] +<span id="L584" class="LineNr">584 </span>] +<span id="L585" class="LineNr">585 </span><span class="traceContains">+error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L586" class="LineNr">586 </span> +<span id="L587" class="LineNr">587 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +<span id="L588" class="LineNr">588 </span>TRACE_SHOULD_CONTAIN<span class="Delimiter">,</span> +<span id="L589" class="LineNr">589 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +<span id="L590" class="LineNr">590 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_CONTAIN<span class="Delimiter">);</span> +<span id="L591" class="LineNr">591 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> +<span id="L592" class="LineNr">592 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> +<span id="L593" class="LineNr">593 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L594" class="LineNr">594 </span><span class="Delimiter">}</span> +<span id="L595" class="LineNr">595 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L596" class="LineNr">596 </span><span class="Normal">case</span> TRACE_SHOULD_CONTAIN: <span class="Delimiter">{</span> +<span id="L597" class="LineNr">597 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L598" class="LineNr">598 </span> check_trace<span class="Delimiter">(</span>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>name<span class="Delimiter">);</span> +<span id="L599" class="LineNr">599 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L600" class="LineNr">600 </span><span class="Delimiter">}</span> +<span id="L601" class="LineNr">601 </span> +<span id="L602" class="LineNr">602 </span><span class="Delimiter">:(code)</span> +<span id="L603" class="LineNr">603 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> +<span id="L604" class="LineNr">604 </span><span class="Comment">// than just printing to stderr</span> +<span id="L605" class="LineNr">605 </span><span class="Normal">void</span> check_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L606" class="LineNr">606 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> +<span id="L607" class="LineNr">607 </span> vector<trace_line> expected_lines = parse_trace<span class="Delimiter">(</span>expected<span class="Delimiter">);</span> +<span id="L608" class="LineNr">608 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L609" class="LineNr">609 </span> <span class="Normal">int</span> curr_expected_line = <span class="Constant">0</span><span class="Delimiter">;</span> +<span id="L610" class="LineNr">610 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>vector<trace_line>::iterator p = Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Trace_stream<span class="Delimiter">-></span>past_lines<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L611" class="LineNr">611 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label != p<span class="Delimiter">-></span>label<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L612" class="LineNr">612 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents != <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>p<span class="Delimiter">-></span>contents<span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L613" class="LineNr">613 </span> <span class="Comment">// match</span> +<span id="L614" class="LineNr">614 </span> ++curr_expected_line<span class="Delimiter">;</span> +<span id="L615" class="LineNr">615 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>curr_expected_line == <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">))</span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L616" class="LineNr">616 </span> <span class="Delimiter">}</span> +<span id="L617" class="LineNr">617 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> +<span id="L618" class="LineNr">618 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> +<span id="L619" class="LineNr">619 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L620" class="LineNr">620 </span> <span class="Normal">else</span> +<span id="L621" class="LineNr">621 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"missing ["</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>contents << <span class="Constant">"] "</span> +<span id="L622" class="LineNr">622 </span> << <span class="Constant">"in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L623" class="LineNr">623 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span> +<span id="L624" class="LineNr">624 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>expected_lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>curr_expected_line<span class="Delimiter">).</span>label<span class="Delimiter">);</span> +<span id="L625" class="LineNr">625 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L626" class="LineNr">626 </span><span class="Delimiter">}</span> +<span id="L627" class="LineNr">627 </span> +<span id="L628" class="LineNr">628 </span>vector<trace_line> parse_trace<span class="Delimiter">(</span><span class="Normal">const</span> string& expected<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L629" class="LineNr">629 </span> vector<string> buf = <a href='003trace.cc.html#L341'>split</a><span class="Delimiter">(</span>expected<span class="Delimiter">,</span> <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> +<span id="L630" class="LineNr">630 </span> vector<trace_line> result<span class="Delimiter">;</span> +<span id="L631" class="LineNr">631 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>buf<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L632" class="LineNr">632 </span> buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)</span> = <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">));</span> +<span id="L633" class="LineNr">633 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L634" class="LineNr">634 </span> <span class="Normal">int</span> delim = buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>find<span class="Delimiter">(</span><span class="Constant">": "</span><span class="Delimiter">);</span> +<span id="L635" class="LineNr">635 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>delim == -<span class="Constant">1</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L636" class="LineNr">636 </span> <a href='003trace.cc.html#L178'>raise</a> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": lines in 'trace-should-contain' should be of the form <label>: <contents>. Both parts are required.</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L637" class="LineNr">637 </span> result<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L638" class="LineNr">638 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L639" class="LineNr">639 </span> <span class="Delimiter">}</span> +<span id="L640" class="LineNr">640 </span> result<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>trace_line<span class="Delimiter">(</span><a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">,</span> delim<span class="Delimiter">)),</span> <a href='003trace.cc.html#L365'>trim</a><span class="Delimiter">(</span>buf<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>substr<span class="Delimiter">(</span>delim+<span class="Constant">2</span><span class="Delimiter">))));</span> +<span id="L641" class="LineNr">641 </span> <span class="Delimiter">}</span> +<span id="L642" class="LineNr">642 </span> <span class="Identifier">return</span> result<span class="Delimiter">;</span> +<span id="L643" class="LineNr">643 </span><span class="Delimiter">}</span> +<span id="L644" class="LineNr">644 </span> +<span id="L645" class="LineNr">645 </span><span class="Delimiter">:(scenario trace_check_fails_in_nonfirst_line)</span> +<span id="L646" class="LineNr">646 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L647" class="LineNr">647 </span><span class="Special">% Hide_errors = true;</span> +<span id="L648" class="LineNr">648 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L649" class="LineNr">649 </span> run [ +<span id="L650" class="LineNr">650 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L651" class="LineNr">651 </span> ] +<span id="L652" class="LineNr">652 </span> trace-should-contain [ +<span id="L653" class="LineNr">653 </span> <span class="Normal">a</span>: b +<span id="L654" class="LineNr">654 </span> <span class="Normal">a</span>: d +<span id="L655" class="LineNr">655 </span> ] +<span id="L656" class="LineNr">656 </span>] +<span id="L657" class="LineNr">657 </span><span class="traceContains">+error: missing [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L658" class="LineNr">658 </span> +<span id="L659" class="LineNr">659 </span><span class="Delimiter">:(scenario trace_check_passes_silently)</span> +<span id="L660" class="LineNr">660 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L661" class="LineNr">661 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L662" class="LineNr">662 </span> run [ +<span id="L663" class="LineNr">663 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L664" class="LineNr">664 </span> ] +<span id="L665" class="LineNr">665 </span> trace-should-contain [ +<span id="L666" class="LineNr">666 </span> <span class="Normal">a</span>: b +<span id="L667" class="LineNr">667 </span> ] +<span id="L668" class="LineNr">668 </span>] +<span id="L669" class="LineNr">669 </span><span class="traceAbsent">-error: missing [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L670" class="LineNr">670 </span>$error: <span class="Constant">0</span> +<span id="L671" class="LineNr">671 </span> +<span id="L672" class="LineNr">672 </span><span class="Comment">//: 'trace-should-not-contain' is like the '-' lines in our scenarios so far</span> +<span id="L673" class="LineNr">673 </span><span class="Comment">//: Each trace line is separately checked for absense. Order is *not*</span> +<span id="L674" class="LineNr">674 </span><span class="Comment">//: important, so you can't say things like "B should not exist after A."</span> +<span id="L675" class="LineNr">675 </span> +<span id="L676" class="LineNr">676 </span><span class="Delimiter">:(scenario trace_negative_check_fails)</span> +<span id="L677" class="LineNr">677 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L678" class="LineNr">678 </span><span class="Special">% Hide_errors = true;</span> +<span id="L679" class="LineNr">679 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L680" class="LineNr">680 </span> run [ +<span id="L681" class="LineNr">681 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [b] +<span id="L682" class="LineNr">682 </span> ] +<span id="L683" class="LineNr">683 </span> trace-should-<span class="Normal">not</span>-contain [ +<span id="L684" class="LineNr">684 </span> <span class="Normal">a</span>: b +<span id="L685" class="LineNr">685 </span> ] +<span id="L686" class="LineNr">686 </span>] +<span id="L687" class="LineNr">687 </span><span class="traceContains">+error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L688" class="LineNr">688 </span> +<span id="L689" class="LineNr">689 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +<span id="L690" class="LineNr">690 </span>TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">,</span> +<span id="L691" class="LineNr">691 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +<span id="L692" class="LineNr">692 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"trace-should-not-contain"</span><span class="Delimiter">,</span> TRACE_SHOULD_NOT_CONTAIN<span class="Delimiter">);</span> +<span id="L693" class="LineNr">693 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> +<span id="L694" class="LineNr">694 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> +<span id="L695" class="LineNr">695 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L696" class="LineNr">696 </span><span class="Delimiter">}</span> +<span id="L697" class="LineNr">697 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L698" class="LineNr">698 </span><span class="Normal">case</span> TRACE_SHOULD_NOT_CONTAIN: <span class="Delimiter">{</span> +<span id="L699" class="LineNr">699 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L700" class="LineNr">700 </span> check_trace_missing<span class="Delimiter">(</span>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>name<span class="Delimiter">);</span> +<span id="L701" class="LineNr">701 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L702" class="LineNr">702 </span><span class="Delimiter">}</span> +<span id="L703" class="LineNr">703 </span> +<span id="L704" class="LineNr">704 </span><span class="Delimiter">:(code)</span> +<span id="L705" class="LineNr">705 </span><span class="Comment">// simplified version of check_trace_contents() that emits errors rather</span> +<span id="L706" class="LineNr">706 </span><span class="Comment">// than just printing to stderr</span> +<span id="L707" class="LineNr">707 </span><span class="Normal">bool</span> check_trace_missing<span class="Delimiter">(</span><span class="Normal">const</span> string& in<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L708" class="LineNr">708 </span> Trace_stream<span class="Delimiter">-></span><a href='003trace.cc.html#L137'>newline</a><span class="Delimiter">();</span> +<span id="L709" class="LineNr">709 </span> vector<trace_line> lines = parse_trace<span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L710" class="LineNr">710 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>lines<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L711" class="LineNr">711 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>trace_count<span class="Delimiter">(</span>lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label<span class="Delimiter">,</span> lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents<span class="Delimiter">)</span> != <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L712" class="LineNr">712 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"unexpected ["</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>contents << <span class="Constant">"] in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << lines<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>label << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L713" class="LineNr">713 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L714" class="LineNr">714 </span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L715" class="LineNr">715 </span> <span class="Delimiter">}</span> +<span id="L716" class="LineNr">716 </span> <span class="Delimiter">}</span> +<span id="L717" class="LineNr">717 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L718" class="LineNr">718 </span><span class="Delimiter">}</span> +<span id="L719" class="LineNr">719 </span> +<span id="L720" class="LineNr">720 </span><span class="Delimiter">:(scenario trace_negative_check_passes_silently)</span> +<span id="L721" class="LineNr">721 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L722" class="LineNr">722 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L723" class="LineNr">723 </span> trace-should-<span class="Normal">not</span>-contain [ +<span id="L724" class="LineNr">724 </span> <span class="Normal">a</span>: b +<span id="L725" class="LineNr">725 </span> ] +<span id="L726" class="LineNr">726 </span>] +<span id="L727" class="LineNr">727 </span><span class="traceAbsent">-error: unexpected [b] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L728" class="LineNr">728 </span>$error: <span class="Constant">0</span> +<span id="L729" class="LineNr">729 </span> +<span id="L730" class="LineNr">730 </span><span class="Delimiter">:(scenario trace_negative_check_fails_on_any_unexpected_line)</span> +<span id="L731" class="LineNr">731 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L732" class="LineNr">732 </span><span class="Special">% Hide_errors = true;</span> +<span id="L733" class="LineNr">733 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L734" class="LineNr">734 </span> run [ +<span id="L735" class="LineNr">735 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [d] +<span id="L736" class="LineNr">736 </span> ] +<span id="L737" class="LineNr">737 </span> trace-should-<span class="Normal">not</span>-contain [ +<span id="L738" class="LineNr">738 </span> <span class="Normal">a</span>: b +<span id="L739" class="LineNr">739 </span> <span class="Normal">a</span>: d +<span id="L740" class="LineNr">740 </span> ] +<span id="L741" class="LineNr">741 </span>] +<span id="L742" class="LineNr">742 </span><span class="traceContains">+error: unexpected [d] in <a href='003trace.cc.html#L171'>trace</a> with label 'a'</span> +<span id="L743" class="LineNr">743 </span> +<span id="L744" class="LineNr">744 </span><span class="Delimiter">:(scenario trace_count_check)</span> +<span id="L745" class="LineNr">745 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L746" class="LineNr">746 </span> run [ +<span id="L747" class="LineNr">747 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] +<span id="L748" class="LineNr">748 </span> ] +<span id="L749" class="LineNr">749 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">1</span><span class="Delimiter">,</span> [a] +<span id="L750" class="LineNr">750 </span>] +<span id="L751" class="LineNr">751 </span><span class="Comment"># checks are inside scenario</span> +<span id="L752" class="LineNr">752 </span> +<span id="L753" class="LineNr">753 </span><span class="Delimiter">:(before "End Primitive Recipe Declarations")</span> +<span id="L754" class="LineNr">754 </span>CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">,</span> +<span id="L755" class="LineNr">755 </span><span class="Delimiter">:(before "End Primitive Recipe Numbers")</span> +<span id="L756" class="LineNr">756 </span><a href='001help.cc.html#L218'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">"check-trace-count-for-label"</span><span class="Delimiter">,</span> CHECK_TRACE_COUNT_FOR_LABEL<span class="Delimiter">);</span> +<span id="L757" class="LineNr">757 </span><span class="Delimiter">:(before "End Primitive Recipe Checks")</span> +<span id="L758" class="LineNr">758 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span> +<span id="L759" class="LineNr">759 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L138'>SIZE</a><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="L760" class="LineNr">760 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"'check-trace-count-for-label' requires exactly two ingredients, but got '"</span> << inst<span class="Delimiter">.</span>original_string << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L761" class="LineNr">761 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L762" class="LineNr">762 </span> <span class="Delimiter">}</span> +<span id="L763" class="LineNr">763 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_number<span class="Delimiter">(</span>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="Delimiter">{</span> +<span id="L764" class="LineNr">764 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"first ingredient of 'check-trace-count-for-label' should be a number (count), but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L765" class="LineNr">765 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L766" class="LineNr">766 </span> <span class="Delimiter">}</span> +<span id="L767" class="LineNr">767 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal_text<span class="Delimiter">(</span>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 class="Delimiter">{</span> +<span id="L768" class="LineNr">768 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> << <span class="Constant">"second ingredient of 'check-trace-count-for-label' should be a literal string (label), but got '"</span> << 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 << <span class="Constant">"'</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L769" class="LineNr">769 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L770" class="LineNr">770 </span> <span class="Delimiter">}</span> <span id="L771" class="LineNr">771 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> <span id="L772" class="LineNr">772 </span><span class="Delimiter">}</span> -<span id="L773" class="LineNr">773 </span> -<span id="L774" class="LineNr">774 </span><span class="Delimiter">:(scenario trace_count_check_2)</span> -<span id="L775" class="LineNr">775 </span><span class="Special">% Scenario_testing_scenario = true;</span> -<span id="L776" class="LineNr">776 </span><span class="Special">% Hide_errors = true;</span> -<span id="L777" class="LineNr">777 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ -<span id="L778" class="LineNr">778 </span> run [ -<span id="L779" class="LineNr">779 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] -<span id="L780" class="LineNr">780 </span> ] -<span id="L781" class="LineNr">781 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">2</span><span class="Delimiter">,</span> [a] -<span id="L782" class="LineNr">782 </span>] -<span id="L783" class="LineNr">783 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: expected 2 lines in <a href='003trace.cc.html#L171'>trace</a> with label 'a' in <a href='003trace.cc.html#L171'>trace</a></span> -<span id="L784" class="LineNr">784 </span> -<span id="L785" class="LineNr">785 </span><span class="Comment">//: Minor detail: ignore 'system' calls in scenarios, since anything we do</span> -<span id="L786" class="LineNr">786 </span><span class="Comment">//: with them is by definition impossible to test through Mu.</span> -<span id="L787" class="LineNr">787 </span><span class="Delimiter">:(after "case _SYSTEM:")</span> -<span id="L788" class="LineNr">788 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> -<span id="L789" class="LineNr">789 </span> -<span id="L790" class="LineNr">790 </span><span class="SalientComment">//:: Warn if people use '_' manually in function names. They're reserved for internal use.</span> -<span id="L791" class="LineNr">791 </span> -<span id="L792" class="LineNr">792 </span><span class="Delimiter">:(scenario recipe_name_with_underscore)</span> -<span id="L793" class="LineNr">793 </span><span class="Special">% Hide_errors = true;</span> -<span id="L794" class="LineNr">794 </span><span class="muRecipe">def</span> foo_bar [ -<span id="L795" class="LineNr">795 </span>] -<span id="L796" class="LineNr">796 </span><span class="traceContains">+error: foo_bar: don't create recipes with '_' in the name</span> -<span id="L797" class="LineNr">797 </span> -<span id="L798" class="LineNr">798 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> -<span id="L799" class="LineNr">799 </span><span class="Normal">bool</span> is_autogenerated<span class="Delimiter">;</span> -<span id="L800" class="LineNr">800 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Constructor")</span> -<span id="L801" class="LineNr">801 </span>is_autogenerated = <span class="Constant">false</span><span class="Delimiter">;</span> -<span id="L802" class="LineNr">802 </span><span class="Delimiter">:(code)</span> -<span id="L803" class="LineNr">803 </span><span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L804" class="LineNr">804 </span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span> -<span id="L805" class="LineNr">805 </span><span class="Delimiter">}</span> -<span id="L806" class="LineNr">806 </span> -<span id="L807" class="LineNr">807 </span><span class="Delimiter">:(after "void transform_all()")</span> -<span id="L808" class="LineNr">808 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L809" class="LineNr">809 </span> <span class="Normal">const</span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> -<span id="L810" class="LineNr">810 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> == string::npos<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> -<span id="L811" class="LineNr">811 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>is_autogenerated<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// created by previous call to transform_all()</span> -<span id="L812" class="LineNr">812 </span> <a href='003trace.cc.html#L178'>raise</a> << r<span class="Delimiter">.</span>name << <span class="Constant">": don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> -<span id="L813" class="LineNr">813 </span> <span class="Delimiter">}</span> -<span id="L814" class="LineNr">814 </span> -<span id="L815" class="LineNr">815 </span><span class="SalientComment">//:: Helpers</span> -<span id="L816" class="LineNr">816 </span> -<span id="L817" class="LineNr">817 </span><span class="Delimiter">:(code)</span> -<span id="L818" class="LineNr">818 </span><span class="Comment">// just for the scenarios running scenarios in C++ layers</span> -<span id="L819" class="LineNr">819 </span><span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> string& form<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L820" class="LineNr">820 </span> istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span> -<span id="L821" class="LineNr">821 </span> in >> std::noskipws<span class="Delimiter">;</span> -<span id="L822" class="LineNr">822 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L823" class="LineNr">823 </span> string _scenario = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L824" class="LineNr">824 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_scenario<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> -<span id="L825" class="LineNr">825 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> -<span id="L826" class="LineNr">826 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"no <a href='050scenario.cc.html#L57'>scenario</a> in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> -<span id="L827" class="LineNr">827 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> -<span id="L828" class="LineNr">828 </span> <span class="Delimiter">}</span> -<span id="L829" class="LineNr">829 </span> assert<span class="Delimiter">(</span>_scenario == <span class="Constant">"scenario"</span><span class="Delimiter">);</span> -<span id="L830" class="LineNr">830 </span> <a href='050scenario.cc.html#L57'>scenario</a> s = <a href='050scenario.cc.html#L84'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> -<span id="L831" class="LineNr">831 </span> run_mu_scenario<span class="Delimiter">(</span>s<span class="Delimiter">);</span> -<span id="L832" class="LineNr">832 </span><span class="Delimiter">}</span> +<span id="L773" class="LineNr">773 </span><span class="Delimiter">:(before "End Primitive Recipe Implementations")</span> +<span id="L774" class="LineNr">774 </span><span class="Normal">case</span> CHECK_TRACE_COUNT_FOR_LABEL: <span class="Delimiter">{</span> +<span id="L775" class="LineNr">775 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Passed<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L776" class="LineNr">776 </span> <span class="Normal">int</span> expected_count = ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L777" class="LineNr">777 </span> string label = current_instruction<span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name<span class="Delimiter">;</span> +<span id="L778" class="LineNr">778 </span> <span class="Normal">int</span> count = trace_count<span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L779" class="LineNr">779 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>count != expected_count<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L780" class="LineNr">780 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario && !Scenario_testing_scenario<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L781" class="LineNr">781 </span> <span class="Comment">// genuine test in a .mu file</span> +<span id="L782" class="LineNr">782 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"</span><span class="cSpecial">\n</span><span class="Constant">F - "</span> << Current_scenario<span class="Delimiter">-></span>name << <span class="Constant">": "</span> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a>: "</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L783" class="LineNr">783 </span> <a href='003trace.cc.html#L175'>DUMP</a><span class="Delimiter">(</span>label<span class="Delimiter">);</span> +<span id="L784" class="LineNr">784 </span> <span class="Delimiter">}</span> +<span id="L785" class="LineNr">785 </span> <span class="Normal">else</span> <span class="Delimiter">{</span> +<span id="L786" class="LineNr">786 </span> <span class="Comment">// just testing scenario support</span> +<span id="L787" class="LineNr">787 </span> <a href='003trace.cc.html#L178'>raise</a> << <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>current_recipe_name<span class="Delimiter">())</span> << <span class="Constant">"expected "</span> << expected_count << <span class="Constant">" lines in <a href='003trace.cc.html#L171'>trace</a> with label '"</span> << label << <span class="Constant">"' in <a href='003trace.cc.html#L171'>trace</a></span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L788" class="LineNr">788 </span> <span class="Delimiter">}</span> +<span id="L789" class="LineNr">789 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Scenario_testing_scenario<span class="Delimiter">)</span> Passed = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L790" class="LineNr">790 </span> <span class="Delimiter">}</span> +<span id="L791" class="LineNr">791 </span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L792" class="LineNr">792 </span><span class="Delimiter">}</span> +<span id="L793" class="LineNr">793 </span> +<span id="L794" class="LineNr">794 </span><span class="Delimiter">:(scenario trace_count_check_2)</span> +<span id="L795" class="LineNr">795 </span><span class="Special">% Scenario_testing_scenario = true;</span> +<span id="L796" class="LineNr">796 </span><span class="Special">% Hide_errors = true;</span> +<span id="L797" class="LineNr">797 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [ +<span id="L798" class="LineNr">798 </span> run [ +<span id="L799" class="LineNr">799 </span> <a href='003trace.cc.html#L171'>trace</a> <span class="Constant">1</span><span class="Delimiter">,</span> [a]<span class="Delimiter">,</span> [foo] +<span id="L800" class="LineNr">800 </span> ] +<span id="L801" class="LineNr">801 </span> check-trace-count-<span class="Normal">for</span>-label <span class="Constant">2</span><span class="Delimiter">,</span> [a] +<span id="L802" class="LineNr">802 </span>] +<span id="L803" class="LineNr">803 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: expected 2 lines in <a href='003trace.cc.html#L171'>trace</a> with label 'a' in <a href='003trace.cc.html#L171'>trace</a></span> +<span id="L804" class="LineNr">804 </span> +<span id="L805" class="LineNr">805 </span><span class="Comment">//: Minor detail: ignore 'system' calls in scenarios, since anything we do</span> +<span id="L806" class="LineNr">806 </span><span class="Comment">//: with them is by definition impossible to test through Mu.</span> +<span id="L807" class="LineNr">807 </span><span class="Delimiter">:(after "case _SYSTEM:")</span> +<span id="L808" class="LineNr">808 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>Current_scenario<span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span> +<span id="L809" class="LineNr">809 </span> +<span id="L810" class="LineNr">810 </span><span class="SalientComment">//:: Warn if people use '_' manually in function names. They're reserved for internal use.</span> +<span id="L811" class="LineNr">811 </span> +<span id="L812" class="LineNr">812 </span><span class="Delimiter">:(scenario recipe_name_with_underscore)</span> +<span id="L813" class="LineNr">813 </span><span class="Special">% Hide_errors = true;</span> +<span id="L814" class="LineNr">814 </span><span class="muRecipe">def</span> foo_bar [ +<span id="L815" class="LineNr">815 </span>] +<span id="L816" class="LineNr">816 </span><span class="traceContains">+error: foo_bar: don't create recipes with '_' in the name</span> +<span id="L817" class="LineNr">817 </span> +<span id="L818" class="LineNr">818 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Fields")</span> +<span id="L819" class="LineNr">819 </span><span class="Normal">bool</span> is_autogenerated<span class="Delimiter">;</span> +<span id="L820" class="LineNr">820 </span><span class="Delimiter">:(before "End <a href='010vm.cc.html#L19'>recipe</a> Constructor")</span> +<span id="L821" class="LineNr">821 </span>is_autogenerated = <span class="Constant">false</span><span class="Delimiter">;</span> +<span id="L822" class="LineNr">822 </span><span class="Delimiter">:(code)</span> +<span id="L823" class="LineNr">823 </span><span class="Normal">void</span> mark_autogenerated<span class="Delimiter">(</span><a href='010vm.cc.html#L14'>recipe_ordinal</a> r<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L824" class="LineNr">824 </span> get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>is_autogenerated = <span class="Constant">true</span><span class="Delimiter">;</span> +<span id="L825" class="LineNr">825 </span><span class="Delimiter">}</span> +<span id="L826" class="LineNr">826 </span> +<span id="L827" class="LineNr">827 </span><span class="Delimiter">:(after "void transform_all()")</span> +<span id="L828" class="LineNr">828 </span> <span class="Normal">for</span> <span class="Delimiter">(</span>map<recipe_ordinal<span class="Delimiter">,</span> recipe>::iterator p = Recipe<span class="Delimiter">.</span>begin<span class="Delimiter">();</span> p != Recipe<span class="Delimiter">.</span><a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> ++p<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L829" class="LineNr">829 </span> <span class="Normal">const</span> recipe& r = p<span class="Delimiter">-></span>second<span class="Delimiter">;</span> +<span id="L830" class="LineNr">830 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>name<span class="Delimiter">.</span>find<span class="Delimiter">(</span><span class="Constant">'_'</span><span class="Delimiter">)</span> == string::npos<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> +<span id="L831" class="LineNr">831 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>r<span class="Delimiter">.</span>is_autogenerated<span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span class="Comment">// created by previous call to transform_all()</span> +<span id="L832" class="LineNr">832 </span> <a href='003trace.cc.html#L178'>raise</a> << r<span class="Delimiter">.</span>name << <span class="Constant">": don't create recipes with '_' in the name</span><span class="cSpecial">\n</span><span class="Constant">"</span> << end<span class="Delimiter">();</span> +<span id="L833" class="LineNr">833 </span> <span class="Delimiter">}</span> +<span id="L834" class="LineNr">834 </span> +<span id="L835" class="LineNr">835 </span><span class="SalientComment">//:: Helpers</span> +<span id="L836" class="LineNr">836 </span> +<span id="L837" class="LineNr">837 </span><span class="Delimiter">:(code)</span> +<span id="L838" class="LineNr">838 </span><span class="Comment">// just for the scenarios running scenarios in C++ layers</span> +<span id="L839" class="LineNr">839 </span><span class="Normal">void</span> run_mu_scenario<span class="Delimiter">(</span><span class="Normal">const</span> string& form<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L840" class="LineNr">840 </span> Scenario_names<span class="Delimiter">.</span><a href='050scenario.cc.html#L60'>clear</a><span class="Delimiter">();</span> +<span id="L841" class="LineNr">841 </span> istringstream in<span class="Delimiter">(</span>form<span class="Delimiter">);</span> +<span id="L842" class="LineNr">842 </span> in >> std::noskipws<span class="Delimiter">;</span> +<span id="L843" class="LineNr">843 </span> <a href='011load.cc.html#L208'>skip_whitespace_and_comments</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L844" class="LineNr">844 </span> string _scenario = <a href='011load.cc.html#L166'>next_word</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L845" class="LineNr">845 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>_scenario<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Delimiter">{</span> +<span id="L846" class="LineNr">846 </span> assert<span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">));</span> +<span id="L847" class="LineNr">847 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"no <a href='050scenario.cc.html#L57'>scenario</a> in string passed into run_mu_scenario()</span><span class="cSpecial">\n</span><span class="Constant">"</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> +<span id="L848" class="LineNr">848 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> +<span id="L849" class="LineNr">849 </span> <span class="Delimiter">}</span> +<span id="L850" class="LineNr">850 </span> assert<span class="Delimiter">(</span>_scenario == <span class="Constant">"scenario"</span><span class="Delimiter">);</span> +<span id="L851" class="LineNr">851 </span> <a href='050scenario.cc.html#L57'>scenario</a> s = <a href='050scenario.cc.html#L91'>parse_scenario</a><span class="Delimiter">(</span>in<span class="Delimiter">);</span> +<span id="L852" class="LineNr">852 </span> run_mu_scenario<span class="Delimiter">(</span>s<span class="Delimiter">);</span> +<span id="L853" class="LineNr">853 </span><span class="Delimiter">}</span> </pre> </body> </html> diff --git a/html/055shape_shifting_container.cc.html b/html/055shape_shifting_container.cc.html index c7d7842f..fb41b269 100644 --- a/html/055shape_shifting_container.cc.html +++ b/html/055shape_shifting_container.cc.html @@ -273,7 +273,7 @@ if ('onhashchange' in window) { <span id="L209" class="LineNr">209 </span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span> <span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span> <span id="L211" class="LineNr">211 </span> -<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L662'>insert_container</a> Special-cases")</span> +<span id="L212" class="LineNr">212 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L661'>insert_container</a> Special-cases")</span> <span id="L213" class="LineNr">213 </span><span class="Comment">// check for use of type ingredients</span> <span id="L214" class="LineNr">214 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient_name<span class="Delimiter">(</span>type<span class="Delimiter">-></span>name<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L215" class="LineNr">215 </span> type<span class="Delimiter">-></span>value = get<span class="Delimiter">(</span>info<span class="Delimiter">.</span>type_ingredient_names<span class="Delimiter">,</span> type<span class="Delimiter">-></span>name<span class="Delimiter">);</span> @@ -378,7 +378,7 @@ if ('onhashchange' in window) { <span id="L314" class="LineNr">314 </span>] <span id="L315" class="LineNr">315 </span><span class="traceContains">+mem: storing 1 in location 4</span> <span id="L316" class="LineNr">316 </span> -<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L431'>element_type</a> Special-cases")</span> +<span id="L317" class="LineNr">317 </span><span class="Delimiter">:(before "End <a href='030container.cc.html#L430'>element_type</a> Special-cases")</span> <span id="L318" class="LineNr">318 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> type<span class="Delimiter">,</span> info<span class="Delimiter">,</span> <span class="Constant">" while computing element type of container"</span><span class="Delimiter">);</span> <span id="L319" class="LineNr">319 </span><span class="Delimiter">:(before "Compute Container Size(element, full_type)")</span> <span id="L320" class="LineNr">320 </span>replace_type_ingredients<span class="Delimiter">(</span>element<span class="Delimiter">,</span> full_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> @@ -413,24 +413,24 @@ if ('onhashchange' in window) { <span id="L349" class="LineNr">349 </span><span class="Delimiter">}</span> <span id="L350" class="LineNr">350 </span> <span id="L351" class="LineNr">351 </span><span class="Comment">// replace all type_ingredients in element_type with corresponding elements of callsite_type</span> -<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L352" class="LineNr">352 </span><span class="Normal">void</span> replace_type_ingredients<span class="Delimiter">(</span>type_tree* <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L353" class="LineNr">353 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!callsite_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span class="Comment">// error but it's already been raised above</span> <span id="L354" class="LineNr">354 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">)</span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L355" class="LineNr">355 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!element_type<span class="Delimiter">-></span>atom<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>right == <span class="Constant">NULL</span> && is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span> -<span id="L357" class="LineNr">357 </span> <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">);</span> +<span id="L356" class="LineNr">356 </span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">-></span>right == <span class="Constant">NULL</span> && is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">))</span> <span class="Delimiter">{</span> +<span id="L357" class="LineNr">357 </span> <span class="Normal">int</span> type_ingredient_index = to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">);</span> <span id="L358" class="LineNr">358 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>corresponding<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">,</span> is_final_type_ingredient<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> container_info<span class="Delimiter">))-></span>right<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L359" class="LineNr">359 </span> <span class="Comment">// replacing type ingredient at end of list, and replacement is a non-degenerate compound type -- (a b) but not (a)</span> -<span id="L360" class="LineNr">360 </span> replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L360" class="LineNr">360 </span> replace_type_ingredient_at<span class="Delimiter">(</span>type_ingredient_index<span class="Delimiter">,</span> <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L361" class="LineNr">361 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L362" class="LineNr">362 </span> <span class="Delimiter">}</span> <span id="L363" class="LineNr">363 </span> <span class="Delimiter">}</span> -<span id="L364" class="LineNr">364 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> -<span id="L365" class="LineNr">365 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">-></span>right<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L364" class="LineNr">364 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">-></span>left<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L365" class="LineNr">365 </span> replace_type_ingredients<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">-></span>right<span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L366" class="LineNr">366 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> <span id="L367" class="LineNr">367 </span> <span class="Delimiter">}</span> -<span id="L368" class="LineNr">368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">))</span> -<span id="L369" class="LineNr">369 </span> replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">),</span> <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> +<span id="L368" class="LineNr">368 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>is_type_ingredient<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">))</span> +<span id="L369" class="LineNr">369 </span> replace_type_ingredient_at<span class="Delimiter">(</span>to_type_ingredient_index<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">),</span> <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">,</span> callsite_type<span class="Delimiter">,</span> container_info<span class="Delimiter">,</span> location_for_error_messages<span class="Delimiter">);</span> <span id="L370" class="LineNr">370 </span><span class="Delimiter">}</span> <span id="L371" class="LineNr">371 </span> <span id="L372" class="LineNr">372 </span><span class="Normal">const</span> type_tree* corresponding<span class="Delimiter">(</span><span class="Normal">const</span> type_tree* type<span class="Delimiter">,</span> <span class="Normal">int</span> index<span class="Delimiter">,</span> <span class="Normal">bool</span> <span class="Normal">final</span><span class="Delimiter">)</span> <span class="Delimiter">{</span> @@ -451,7 +451,7 @@ if ('onhashchange' in window) { <span id="L387" class="LineNr">387 </span> <span class="Identifier">return</span> type<span class="Delimiter">-></span>value-START_TYPE_INGREDIENTS<span class="Delimiter">;</span> <span id="L388" class="LineNr">388 </span><span class="Delimiter">}</span> <span id="L389" class="LineNr">389 </span> -<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> replace_type_ingredient_at<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> type_tree* <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> +<span id="L390" class="LineNr">390 </span><span class="Normal">void</span> replace_type_ingredient_at<span class="Delimiter">(</span><span class="Normal">const</span> <span class="Normal">int</span> type_ingredient_index<span class="Delimiter">,</span> type_tree* <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">,</span> <span class="Normal">const</span> type_tree* callsite_type<span class="Delimiter">,</span> <span class="Normal">const</span> type_info& container_info<span class="Delimiter">,</span> <span class="Normal">const</span> string& location_for_error_messages<span class="Delimiter">)</span> <span class="Delimiter">{</span> <span id="L391" class="LineNr">391 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_nth_type<span class="Delimiter">(</span>callsite_type<span class="Delimiter">,</span> type_ingredient_index<span class="Delimiter">))</span> <span class="Delimiter">{</span> <span id="L392" class="LineNr">392 </span> <a href='003trace.cc.html#L178'>raise</a> << <span class="Constant">"illegal type "</span> << names_to_string<span class="Delimiter">(</span>callsite_type<span class="Delimiter">)</span> << <span class="Constant">" seems to be missing a type ingredient or three"</span> << location_for_error_messages << <span class="cSpecial">'\n'</span> << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L393" class="LineNr">393 </span> <span class="Identifier">return</span><span class="Delimiter">;</span> @@ -491,7 +491,7 @@ if ('onhashchange' in window) { <span id="L427" class="LineNr">427 </span> <span class="Constant">" y:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L428" class="LineNr">428 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L429" class="LineNr">429 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> -<span id="L430" class="LineNr">430 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L430" class="LineNr">430 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L431" class="LineNr">431 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> <span id="L432" class="LineNr">432 </span><span class="Delimiter">}</span> <span id="L433" class="LineNr">433 </span> @@ -503,7 +503,7 @@ if ('onhashchange' in window) { <span id="L439" class="LineNr">439 </span> <span class="Constant">" x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L440" class="LineNr">440 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L441" class="LineNr">441 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:point"</span><span class="Delimiter">);</span> -<span id="L442" class="LineNr">442 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L442" class="LineNr">442 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L443" class="LineNr">443 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">point</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L444" class="LineNr">444 </span><span class="Delimiter">}</span> <span id="L445" class="LineNr">445 </span> @@ -515,7 +515,7 @@ if ('onhashchange' in window) { <span id="L451" class="LineNr">451 </span> <span class="Constant">" x:foo:_elem</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L452" class="LineNr">452 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L453" class="LineNr">453 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:<a href='043space.cc.html#L76'>address</a>:array:character"</span><span class="Delimiter">);</span> -<span id="L454" class="LineNr">454 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L454" class="LineNr">454 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L455" class="LineNr">455 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L456" class="LineNr">456 </span><span class="Delimiter">}</span> <span id="L457" class="LineNr">457 </span> @@ -527,7 +527,7 @@ if ('onhashchange' in window) { <span id="L463" class="LineNr">463 </span> <span class="Constant">" x:foo:_elem:num</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L464" class="LineNr">464 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L465" class="LineNr">465 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:bar:address"</span><span class="Delimiter">);</span> -<span id="L466" class="LineNr">466 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L466" class="LineNr">466 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L467" class="LineNr">467 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{x: (</span><span class="cSpecial">\"</span><span class="Constant">foo</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L468" class="LineNr">468 </span><span class="Delimiter">}</span> <span id="L469" class="LineNr">469 </span> @@ -537,9 +537,9 @@ if ('onhashchange' in window) { <span id="L473" class="LineNr">473 </span> <span class="Constant">" y:_b</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L474" class="LineNr">474 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L475" class="LineNr">475 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo number (address array character))}"</span><span class="Delimiter">);</span> -<span id="L476" class="LineNr">476 </span> reagent element1 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L476" class="LineNr">476 </span> reagent element1 = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L477" class="LineNr">477 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> -<span id="L478" class="LineNr">478 </span> reagent element2 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L478" class="LineNr">478 </span> reagent element2 = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L479" class="LineNr">479 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">"{y: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L480" class="LineNr">480 </span><span class="Delimiter">}</span> <span id="L481" class="LineNr">481 </span> @@ -548,7 +548,7 @@ if ('onhashchange' in window) { <span id="L484" class="LineNr">484 </span> <span class="Constant">" {x: (bar _a (address _b))}</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L485" class="LineNr">485 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L486" class="LineNr">486 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"f:foo:number:array:character"</span><span class="Delimiter">);</span> -<span id="L487" class="LineNr">487 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L487" class="LineNr">487 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L488" class="LineNr">488 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>names_to_string_without_quotes<span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">),</span> <span class="Constant">"(bar number (address array character))"</span><span class="Delimiter">);</span> <span id="L489" class="LineNr">489 </span><span class="Delimiter">}</span> <span id="L490" class="LineNr">490 </span> @@ -559,11 +559,11 @@ if ('onhashchange' in window) { <span id="L495" class="LineNr">495 </span> <span class="Constant">" z:_c</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L496" class="LineNr">496 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L497" class="LineNr">497 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo number (address array character) boolean)}"</span><span class="Delimiter">);</span> -<span id="L498" class="LineNr">498 </span> reagent element1 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L498" class="LineNr">498 </span> reagent element1 = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L499" class="LineNr">499 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element1<span class="Delimiter">),</span> <span class="Constant">"{x: </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> -<span id="L500" class="LineNr">500 </span> reagent element2 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> +<span id="L500" class="LineNr">500 </span> reagent element2 = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">1</span><span class="Delimiter">);</span> <span id="L501" class="LineNr">501 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element2<span class="Delimiter">),</span> <span class="Constant">"{y: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> -<span id="L502" class="LineNr">502 </span> reagent element3 = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> +<span id="L502" class="LineNr">502 </span> reagent element3 = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">2</span><span class="Delimiter">);</span> <span id="L503" class="LineNr">503 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element3<span class="Delimiter">),</span> <span class="Constant">"{z: </span><span class="cSpecial">\"</span><span class="Constant">boolean</span><span class="cSpecial">\"</span><span class="Constant">}"</span><span class="Delimiter">);</span> <span id="L504" class="LineNr">504 </span><span class="Delimiter">}</span> <span id="L505" class="LineNr">505 </span> @@ -573,7 +573,7 @@ if ('onhashchange' in window) { <span id="L509" class="LineNr">509 </span> <span class="Constant">" value:_value</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L510" class="LineNr">510 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L511" class="LineNr">511 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo (address array character) number)}"</span><span class="Delimiter">);</span> -<span id="L512" class="LineNr">512 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L512" class="LineNr">512 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L513" class="LineNr">513 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{key: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L514" class="LineNr">514 </span><span class="Delimiter">}</span> <span id="L515" class="LineNr">515 </span> @@ -587,7 +587,7 @@ if ('onhashchange' in window) { <span id="L523" class="LineNr">523 </span> <span class="Constant">" value:_value</span><span class="cSpecial">\n</span><span class="Constant">"</span> <span id="L524" class="LineNr">524 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L525" class="LineNr">525 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"{f: (foo_table (address array character) number)}"</span><span class="Delimiter">);</span> -<span id="L526" class="LineNr">526 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L526" class="LineNr">526 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L527" class="LineNr">527 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span><a href='028call_return.cc.html#L158'>to_string</a><span class="Delimiter">(</span>element<span class="Delimiter">),</span> <span class="Constant">"{data: (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">foo_table_row</span><span class="cSpecial">\"</span><span class="Constant"> (</span><span class="cSpecial">\"</span><span class="Constant"><a href='043space.cc.html#L76'>address</a></span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">array</span><span class="cSpecial">\"</span><span class="Constant"> </span><span class="cSpecial">\"</span><span class="Constant">character</span><span class="cSpecial">\"</span><span class="Constant">) </span><span class="cSpecial">\"</span><span class="Constant">number</span><span class="cSpecial">\"</span><span class="Constant">)}"</span><span class="Delimiter">);</span> <span id="L528" class="LineNr">528 </span><span class="Delimiter">}</span> <span id="L529" class="LineNr">529 </span> diff --git a/html/056shape_shifting_recipe.cc.html b/html/056shape_shifting_recipe.cc.html index fa91c1e5..2c19f2bb 100644 --- a/html/056shape_shifting_recipe.cc.html +++ b/html/056shape_shifting_recipe.cc.html @@ -724,7 +724,7 @@ if ('onhashchange' in window) { <span id="L659" class="LineNr"> 659 </span> <span class="Constant">"]</span><span class="cSpecial">\n</span><span class="Constant">"</span><span class="Delimiter">);</span> <span id="L660" class="LineNr"> 660 </span> <span class="Comment">// then it should work as usual</span> <span id="L661" class="LineNr"> 661 </span> reagent callsite<span class="Delimiter">(</span><span class="Constant">"x:foo:point"</span><span class="Delimiter">);</span> -<span id="L662" class="LineNr"> 662 </span> reagent element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> +<span id="L662" class="LineNr"> 662 </span> reagent element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>callsite<span class="Delimiter">.</span>type<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span> <span id="L663" class="LineNr"> 663 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>name<span class="Delimiter">,</span> <span class="Constant">"x"</span><span class="Delimiter">);</span> <span id="L664" class="LineNr"> 664 </span> <a href='002test.cc.html#L32'>CHECK_EQ</a><span class="Delimiter">(</span>element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>name<span class="Delimiter">,</span> <span class="Constant">"point"</span><span class="Delimiter">);</span> <span id="L665" class="LineNr"> 665 </span> <a href='002test.cc.html#L25'>CHECK</a><span class="Delimiter">(</span>!element<span class="Delimiter">.</span>type<span class="Delimiter">-></span>right<span class="Delimiter">);</span> diff --git a/html/069hash.cc.html b/html/069hash.cc.html index 277f98e4..ae67a728 100644 --- a/html/069hash.cc.html +++ b/html/069hash.cc.html @@ -156,7 +156,7 @@ if ('onhashchange' in window) { <span id="L93" class="LineNr"> 93 </span> <span class="Normal">int</span> <a href='043space.cc.html#L76'>address</a> = r<span class="Delimiter">.</span>value<span class="Delimiter">;</span> <span id="L94" class="LineNr"> 94 </span> <span class="Normal">int</span> offset = <span class="Constant">0</span><span class="Delimiter">;</span> <span id="L95" class="LineNr"> 95 </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 < <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>info<span class="Delimiter">.</span>elements<span class="Delimiter">);</span> ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span> -<span id="L96" class="LineNr"> 96 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span> +<span id="L96" class="LineNr"> 96 </span> reagent<span class="Comment">/*</span><span class="Comment">copy</span><span class="Comment">*/</span> element = <a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>r<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">);</span> <span id="L97" class="LineNr"> 97 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>has_property<span class="Delimiter">(</span>element<span class="Delimiter">,</span> <span class="Constant">"ignore-for-hash"</span><span class="Delimiter">))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span> <span id="L98" class="LineNr"> 98 </span> element<span class="Delimiter">.</span><a href='010vm.cc.html#L66'>set_value</a><span class="Delimiter">(</span>address+offset<span class="Delimiter">);</span> <span id="L99" class="LineNr"> 99 </span> h = <a href='069hash.cc.html#L34'>hash</a><span class="Delimiter">(</span>h<span class="Delimiter">,</span> element<span class="Delimiter">);</span> diff --git a/html/073wait.cc.html b/html/073wait.cc.html index b393adbe..07a7bb9f 100644 --- a/html/073wait.cc.html +++ b/html/073wait.cc.html @@ -274,7 +274,7 @@ if ('onhashchange' in window) { <span id="L211" class="LineNr">211 </span> <span class="Normal">if</span> <span class="Delimiter">(</span>offset < <span class="Constant">0</span> || offset >= <a href='001help.cc.html#L138'>SIZE</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Type<span class="Delimiter">,</span> base_type<span class="Delimiter">-></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="L212" class="LineNr">212 </span> <span class="Normal">int</span> result = base_address<span class="Delimiter">;</span> <span id="L213" class="LineNr">213 </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 < offset<span class="Delimiter">;</span> ++i<span class="Delimiter">)</span> -<span id="L214" class="LineNr">214 </span> result += size_of<span class="Delimiter">(</span><a href='030container.cc.html#L431'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span> +<span id="L214" class="LineNr">214 </span> result += size_of<span class="Delimiter">(</span><a href='030container.cc.html#L430'>element_type</a><span class="Delimiter">(</span>base<span class="Delimiter">.</span>type<span class="Delimiter">,</span> i<span class="Delimiter">));</span> <span id="L215" class="LineNr">215 </span> <a href='003trace.cc.html#L171'>trace</a><span class="Delimiter">(</span><span class="Constant">9998</span><span class="Delimiter">,</span> <span class="Constant">"run"</span><span class="Delimiter">)</span> << <span class="Constant">"address to copy is "</span> << result << <a href='003trace.cc.html#L195'>end</a><span class="Delimiter">();</span> <span id="L216" class="LineNr">216 </span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span> <span id="L217" class="LineNr">217 </span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span>result<span class="Delimiter">);</span> diff --git a/html/channel.mu.html b/html/channel.mu.html index c620c3f2..df7d6b96 100644 --- a/html/channel.mu.html +++ b/html/channel.mu.html @@ -58,7 +58,7 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: communicating between routines using channels</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> producer sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='channel.mu.html#L3'>producer</a> sink:&:sink:char<span class="muRecipe"> -> </span>sink:&:sink:char [ <span id="L4" class="LineNr"> 4 </span> <span class="Comment"># produce characters 1 to 5 on a channel</span> <span id="L5" class="LineNr"> 5 </span> <span class="Constant">local-scope</span> <span id="L6" class="LineNr"> 6 </span> <span class="Constant">load-ingredients</span> @@ -77,7 +77,7 @@ if ('onhashchange' in window) { <span id="L19" class="LineNr">19 </span> close sink <span id="L20" class="LineNr">20 </span>] <span id="L21" class="LineNr">21 </span> -<span id="L22" class="LineNr">22 </span><span class="muRecipe">def</span> consumer source:&:source:char<span class="muRecipe"> -> </span>source:&:source:char [ +<span id="L22" class="LineNr">22 </span><span class="muRecipe">def</span> <a href='channel.mu.html#L22'>consumer</a> source:&:source:char<span class="muRecipe"> -> </span>source:&:source:char [ <span id="L23" class="LineNr">23 </span> <span class="Comment"># consume and print integers from a channel</span> <span id="L24" class="LineNr">24 </span> <span class="Constant">local-scope</span> <span id="L25" class="LineNr">25 </span> <span class="Constant">load-ingredients</span> @@ -92,12 +92,12 @@ if ('onhashchange' in window) { <span id="L34" class="LineNr">34 </span> <span class="Delimiter">}</span> <span id="L35" class="LineNr">35 </span>] <span id="L36" class="LineNr">36 </span> -<span id="L37" class="LineNr">37 </span><span class="muRecipe">def</span> main [ +<span id="L37" class="LineNr">37 </span><span class="muRecipe">def</span> <a href='channel.mu.html#L37'>main</a> [ <span id="L38" class="LineNr">38 </span> <span class="Constant">local-scope</span> <span id="L39" class="LineNr">39 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">3/capacity</span> <span id="L40" class="LineNr">40 </span> <span class="Comment"># create two background 'routines' that communicate by a channel</span> -<span id="L41" class="LineNr">41 </span> routine1:num <span class="Special"><-</span> start-running producer, sink -<span id="L42" class="LineNr">42 </span> routine2:num <span class="Special"><-</span> start-running consumer, source +<span id="L41" class="LineNr">41 </span> routine1:num <span class="Special"><-</span> start-running <a href='channel.mu.html#L3'>producer</a>, sink +<span id="L42" class="LineNr">42 </span> routine2:num <span class="Special"><-</span> start-running <a href='channel.mu.html#L22'>consumer</a>, source <span id="L43" class="LineNr">43 </span> wait-for-routine routine1 <span id="L44" class="LineNr">44 </span> wait-for-routine routine2 <span id="L45" class="LineNr">45 </span>] diff --git a/html/chessboard.mu.html b/html/chessboard.mu.html index b4bb9426..3abf7bd9 100644 --- a/html/chessboard.mu.html +++ b/html/chessboard.mu.html @@ -63,7 +63,7 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment"># Chessboard program: you type in moves in algebraic notation, and it'll</span> <span id="L2" class="LineNr"> 2 </span><span class="Comment"># display the position after each move.</span> <span id="L3" class="LineNr"> 3 </span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> main [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L4'>main</a> [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">local-scope</span> <span id="L6" class="LineNr"> 6 </span> open-console <span class="Comment"># take control of screen, keyboard and mouse</span> <span id="L7" class="LineNr"> 7 </span> @@ -74,7 +74,7 @@ if ('onhashchange' in window) { <span id="L12" class="LineNr"> 12 </span> <span class="Comment">#</span> <span id="L13" class="LineNr"> 13 </span> <span class="Comment"># Here the console and screen are both 0, which usually indicates real</span> <span id="L14" class="LineNr"> 14 </span> <span class="Comment"># hardware rather than a fake for testing as you'll see below.</span> -<span id="L15" class="LineNr"> 15 </span> chessboard <span class="Constant">0/screen</span>, <span class="Constant">0/console</span> +<span id="L15" class="LineNr"> 15 </span> <a href='chessboard.mu.html#L68'>chessboard</a> <span class="Constant">0/screen</span>, <span class="Constant">0/console</span> <span id="L16" class="LineNr"> 16 </span> <span id="L17" class="LineNr"> 17 </span> close-console <span class="Comment"># clean up screen, keyboard and mouse</span> <span id="L18" class="LineNr"> 18 </span>] @@ -92,7 +92,7 @@ if ('onhashchange' in window) { <span id="L30" class="LineNr"> 30 </span><span class="Constant">]</span> <span id="L31" class="LineNr"> 31 </span> ] <span id="L32" class="LineNr"> 32 </span> run [ -<span id="L33" class="LineNr"> 33 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> chessboard <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> +<span id="L33" class="LineNr"> 33 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> <span class="Special"><-</span> <a href='chessboard.mu.html#L68'>chessboard</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> <span id="L34" class="LineNr"> 34 </span> <span class="Comment"># icon for the cursor</span> <span id="L35" class="LineNr"> 35 </span> cursor-icon:char <span class="Special"><-</span> copy <span class="Constant">9251/␣</span> <span id="L36" class="LineNr"> 36 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, cursor-icon @@ -113,7 +113,7 @@ if ('onhashchange' in window) { <span id="L51" class="LineNr"> 51 </span> <span class="Constant"> . +---------------- .</span> <span id="L52" class="LineNr"> 52 </span> <span class="Constant"> . a b c d e f g h .</span> <span id="L53" class="LineNr"> 53 </span> <span class="Constant"> . .</span> -<span id="L54" class="LineNr"> 54 </span> <span class="Constant"> .Type in your move as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>. .</span> +<span id="L54" class="LineNr"> 54 </span> <span class="Constant"> .Type in your <a href='chessboard.mu.html#L228'>move</a> as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>. .</span> <span id="L55" class="LineNr"> 55 </span> <span class="Constant"> . .</span> <span id="L56" class="LineNr"> 56 </span> <span class="Constant"> .Hit 'q' to exit. .</span> <span id="L57" class="LineNr"> 57 </span> <span class="Constant"> . .</span> @@ -127,10 +127,10 @@ if ('onhashchange' in window) { <span id="L65" class="LineNr"> 65 </span> <span id="L66" class="LineNr"> 66 </span><span class="muData">type</span> board = &:@:&:@:char <span class="Comment"># a 2-D array of arrays of characters</span> <span id="L67" class="LineNr"> 67 </span> -<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> chessboard <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ +<span id="L68" class="LineNr"> 68 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L68'>chessboard</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a><span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, <a href='084console.mu.html#L23'>console</a>:&:<a href='084console.mu.html#L23'>console</a> [ <span id="L69" class="LineNr"> 69 </span> <span class="Constant">local-scope</span> <span id="L70" class="LineNr"> 70 </span> <span class="Constant">load-ingredients</span> -<span id="L71" class="LineNr"> 71 </span> board:board <span class="Special"><-</span> initial-position +<span id="L71" class="LineNr"> 71 </span> board:board <span class="Special"><-</span> <a href='chessboard.mu.html#L179'>initial-position</a> <span id="L72" class="LineNr"> 72 </span> <span class="Comment"># hook up stdin</span> <span id="L73" class="LineNr"> 73 </span> stdin-in:&:source:char, stdin-out:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">10/capacity</span> <span id="L74" class="LineNr"> 74 </span> start-running <a href='084console.mu.html#L73'>send-keys-to-channel</a>, <a href='084console.mu.html#L23'>console</a>, stdin-out, <a href='081print.mu.html#L4'>screen</a> @@ -141,9 +141,9 @@ if ('onhashchange' in window) { <span id="L79" class="LineNr"> 79 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[Stupid text-mode chessboard. White pieces in uppercase; black pieces in lowercase. No checking for legal moves.</span> <span id="L80" class="LineNr"> 80 </span><span class="Constant">]</span> <span id="L81" class="LineNr"> 81 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> -<span id="L82" class="LineNr"> 82 </span> print-board <a href='081print.mu.html#L4'>screen</a>, board +<span id="L82" class="LineNr"> 82 </span> <a href='chessboard.mu.html#L143'>print-board</a> <a href='081print.mu.html#L4'>screen</a>, board <span id="L83" class="LineNr"> 83 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> -<span id="L84" class="LineNr"> 84 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[Type in your move as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>.</span> +<span id="L84" class="LineNr"> 84 </span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[Type in your <a href='chessboard.mu.html#L228'>move</a> as <from square>-<to square>. For example: 'a2-a4'. Then press <enter>.</span> <span id="L85" class="LineNr"> 85 </span><span class="Constant">]</span> <span id="L86" class="LineNr"> 86 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L87" class="LineNr"> 87 </span> print <a href='081print.mu.html#L4'>screen</a> <span class="Constant">[Hit 'q' to exit.</span> @@ -151,12 +151,12 @@ if ('onhashchange' in window) { <span id="L89" class="LineNr"> 89 </span> <span class="Delimiter">{</span> <span id="L90" class="LineNr"> 90 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L91" class="LineNr"> 91 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print <a href='081print.mu.html#L4'>screen</a>, <span class="Constant">[move: ]</span> -<span id="L92" class="LineNr"> 92 </span> m:&:move, quit:bool, error:bool <span class="Special"><-</span> read-move buffered-stdin-in, <a href='081print.mu.html#L4'>screen</a> +<span id="L92" class="LineNr"> 92 </span> m:&:<a href='chessboard.mu.html#L228'>move</a>, quit:bool, error:bool <span class="Special"><-</span> <a href='chessboard.mu.html#L237'>read-move</a> buffered-stdin-in, <a href='081print.mu.html#L4'>screen</a> <span id="L93" class="LineNr"> 93 </span> <span class="muControl">break-if</span> quit, <span class="Constant">+quit</span> <span id="L94" class="LineNr"> 94 </span> buffered-stdin-in <span class="Special"><-</span> <a href='075channel.mu.html#L161'>clear</a> buffered-stdin-in <span class="Comment"># cleanup after error. todo: test this?</span> <span id="L95" class="LineNr"> 95 </span> <span class="muControl">loop-if</span> error <span id="L96" class="LineNr"> 96 </span> <span class="Delimiter">}</span> -<span id="L97" class="LineNr"> 97 </span> board <span class="Special"><-</span> make-move board, m +<span id="L97" class="LineNr"> 97 </span> board <span class="Special"><-</span> <a href='chessboard.mu.html#L536'>make-move</a> board, m <span id="L98" class="LineNr"> 98 </span> <a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='081print.mu.html#L27'>clear-screen</a> <a href='081print.mu.html#L4'>screen</a> <span id="L99" class="LineNr"> 99 </span> <span class="muControl">loop</span> <span id="L100" class="LineNr">100 </span> <span class="Delimiter">}</span> @@ -165,7 +165,7 @@ if ('onhashchange' in window) { <span id="L103" class="LineNr">103 </span> <span id="L104" class="LineNr">104 </span><span class="SalientComment">## a board is an array of files, a file is an array of characters (squares)</span> <span id="L105" class="LineNr">105 </span> -<span id="L106" class="LineNr">106 </span><span class="muRecipe">def</span> new-board initial-position:&:@:char<span class="muRecipe"> -> </span>board:board [ +<span id="L106" class="LineNr">106 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L106'>new-board</a> <a href='chessboard.mu.html#L179'>initial-position</a>:&:@:char<span class="muRecipe"> -> </span>board:board [ <span id="L107" class="LineNr">107 </span> <span class="Constant">local-scope</span> <span id="L108" class="LineNr">108 </span> <span class="Constant">load-ingredients</span> <span id="L109" class="LineNr">109 </span> <span class="Comment"># assert(length(initial-position) == 64)</span> @@ -178,14 +178,14 @@ if ('onhashchange' in window) { <span id="L116" class="LineNr">116 </span> <span class="Delimiter">{</span> <span id="L117" class="LineNr">117 </span> done?:bool <span class="Special"><-</span> equal col,<span class="Constant"> 8</span> <span id="L118" class="LineNr">118 </span> <span class="muControl">break-if</span> done? -<span id="L119" class="LineNr">119 </span> file:&:@:char <span class="Special"><-</span> new-file initial-position, col +<span id="L119" class="LineNr">119 </span> file:&:@:char <span class="Special"><-</span> <a href='chessboard.mu.html#L126'>new-file</a> <a href='chessboard.mu.html#L179'>initial-position</a>, col <span id="L120" class="LineNr">120 </span> *board <span class="Special"><-</span> put-index *board, col, file <span id="L121" class="LineNr">121 </span> col <span class="Special"><-</span> add col,<span class="Constant"> 1</span> <span id="L122" class="LineNr">122 </span> <span class="muControl">loop</span> <span id="L123" class="LineNr">123 </span> <span class="Delimiter">}</span> <span id="L124" class="LineNr">124 </span>] <span id="L125" class="LineNr">125 </span> -<span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> new-file position:&:@:char, index:num<span class="muRecipe"> -> </span>result:&:@:char [ +<span id="L126" class="LineNr">126 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L126'>new-file</a> position:&:@:char, index:num<span class="muRecipe"> -> </span>result:&:@:char [ <span id="L127" class="LineNr">127 </span> <span class="Constant">local-scope</span> <span id="L128" class="LineNr">128 </span> <span class="Constant">load-ingredients</span> <span id="L129" class="LineNr">129 </span> index <span class="Special"><-</span> multiply index,<span class="Constant"> 8</span> @@ -202,7 +202,7 @@ if ('onhashchange' in window) { <span id="L140" class="LineNr">140 </span> <span class="Delimiter">}</span> <span id="L141" class="LineNr">141 </span>] <span id="L142" class="LineNr">142 </span> -<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board:board<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ +<span id="L143" class="LineNr">143 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L143'>print-board</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board:board<span class="muRecipe"> -> </span><a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L144" class="LineNr">144 </span> <span class="Constant">local-scope</span> <span id="L145" class="LineNr">145 </span> <span class="Constant">load-ingredients</span> <span id="L146" class="LineNr">146 </span> row:num <span class="Special"><-</span> copy<span class="Constant"> 7</span> <span class="Comment"># start printing from the top of the board</span> @@ -238,7 +238,7 @@ if ('onhashchange' in window) { <span id="L176" class="LineNr">176 </span> <a href='081print.mu.html#L567'>cursor-to-next-line</a> <a href='081print.mu.html#L4'>screen</a> <span id="L177" class="LineNr">177 </span>] <span id="L178" class="LineNr">178 </span> -<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> initial-position<span class="muRecipe"> -> </span>board:board [ +<span id="L179" class="LineNr">179 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L179'>initial-position</a><span class="muRecipe"> -> </span>board:board [ <span id="L180" class="LineNr">180 </span> <span class="Constant">local-scope</span> <span id="L181" class="LineNr">181 </span> <span class="Comment"># layout in memory (in raster order):</span> <span id="L182" class="LineNr">182 </span> <span class="Comment"># R P _ _ _ _ p r</span> @@ -249,7 +249,7 @@ if ('onhashchange' in window) { <span id="L187" class="LineNr">187 </span> <span class="Comment"># B P _ _ _ _ p B</span> <span id="L188" class="LineNr">188 </span> <span class="Comment"># N P _ _ _ _ p n</span> <span id="L189" class="LineNr">189 </span> <span class="Comment"># R P _ _ _ _ p r</span> -<span id="L190" class="LineNr">190 </span> initial-position:&:@:char <span class="Special"><-</span> <a href='063array.mu.html#L16'>new-array</a> <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">81/Q</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">113/q</span>, <span class="Constant">75/K</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">107/k</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span> +<span id="L190" class="LineNr">190 </span> <a href='chessboard.mu.html#L179'>initial-position</a>:&:@:char <span class="Special"><-</span> <a href='063array.mu.html#L16'>new-array</a> <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">81/Q</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">113/q</span>, <span class="Constant">75/K</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">107/k</span>, <span class="Constant">66/B</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">98/b</span>, <span class="Constant">78/N</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">110/n</span>, <span class="Constant">82/R</span>, <span class="Constant">80/P</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">32/blank</span>, <span class="Constant">112/p</span>, <span class="Constant">114/r</span> <span id="L191" class="LineNr">191 </span><span class="CommentedCode">#? 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r,</span> <span id="L192" class="LineNr">192 </span><span class="CommentedCode">#? 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n,</span> <span id="L193" class="LineNr">193 </span><span class="CommentedCode">#? 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b, </span> @@ -258,15 +258,15 @@ if ('onhashchange' in window) { <span id="L196" class="LineNr">196 </span><span class="CommentedCode">#? 66/B, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 98/b,</span> <span id="L197" class="LineNr">197 </span><span class="CommentedCode">#? 78/N, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 110/n,</span> <span id="L198" class="LineNr">198 </span><span class="CommentedCode">#? 82/R, 80/P, 32/blank, 32/blank, 32/blank, 32/blank, 112/p, 114/r</span> -<span id="L199" class="LineNr">199 </span> board <span class="Special"><-</span> new-board initial-position +<span id="L199" class="LineNr">199 </span> board <span class="Special"><-</span> <a href='chessboard.mu.html#L106'>new-board</a> <a href='chessboard.mu.html#L179'>initial-position</a> <span id="L200" class="LineNr">200 </span>] <span id="L201" class="LineNr">201 </span> <span id="L202" class="LineNr">202 </span><span class="muScenario">scenario</span> printing-the-board [ <span id="L203" class="LineNr">203 </span> <span class="Constant">local-scope</span> -<span id="L204" class="LineNr">204 </span> board:board <span class="Special"><-</span> initial-position +<span id="L204" class="LineNr">204 </span> board:board <span class="Special"><-</span> <a href='chessboard.mu.html#L179'>initial-position</a> <span id="L205" class="LineNr">205 </span> assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span> <span id="L206" class="LineNr">206 </span> run [ -<span id="L207" class="LineNr">207 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board +<span id="L207" class="LineNr">207 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='chessboard.mu.html#L143'>print-board</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board <span id="L208" class="LineNr">208 </span> ] <span id="L209" class="LineNr">209 </span> screen-should-contain [ <span id="L210" class="LineNr">210 </span> <span class="Comment"># 012345678901234567890123456789</span> @@ -287,7 +287,7 @@ if ('onhashchange' in window) { <span id="L225" class="LineNr">225 </span> <span id="L226" class="LineNr">226 </span><span class="SalientComment">## data structure: move</span> <span id="L227" class="LineNr">227 </span> -<span id="L228" class="LineNr">228 </span><span class="muData">container</span> move [ +<span id="L228" class="LineNr">228 </span><span class="muData">container</span> <a href='chessboard.mu.html#L228'>move</a> [ <span id="L229" class="LineNr">229 </span> <span class="Comment"># valid range: 0-7</span> <span id="L230" class="LineNr">230 </span> from-file:num <span id="L231" class="LineNr">231 </span> from-rank:num @@ -296,35 +296,35 @@ if ('onhashchange' in window) { <span id="L234" class="LineNr">234 </span>] <span id="L235" class="LineNr">235 </span> <span id="L236" class="LineNr">236 </span><span class="Comment"># prints only error messages to screen</span> -<span id="L237" class="LineNr">237 </span><span class="muRecipe">def</span> read-move stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:&:move, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ +<span id="L237" class="LineNr">237 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L237'>read-move</a> stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:&:<a href='chessboard.mu.html#L228'>move</a>, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L238" class="LineNr">238 </span> <span class="Constant">local-scope</span> <span id="L239" class="LineNr">239 </span> <span class="Constant">load-ingredients</span> -<span id="L240" class="LineNr">240 </span> from-file:num, quit?:bool, error?:bool <span class="Special"><-</span> read-file stdin, <a href='081print.mu.html#L4'>screen</a> +<span id="L240" class="LineNr">240 </span> from-file:num, quit?:bool, error?:bool <span class="Special"><-</span> <a href='chessboard.mu.html#L265'>read-file</a> stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L241" class="LineNr">241 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L242" class="LineNr">242 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L243" class="LineNr">243 </span> <span class="Comment"># construct the move object</span> -<span id="L244" class="LineNr">244 </span> result:&:move <span class="Special"><-</span> new <span class="Constant">move:type</span> +<span id="L244" class="LineNr">244 </span> result:&:<a href='chessboard.mu.html#L228'>move</a> <span class="Special"><-</span> new <span class="Constant"><a href='chessboard.mu.html#L228'>move</a>:type</span> <span id="L245" class="LineNr">245 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">from-file:offset</span>, from-file -<span id="L246" class="LineNr">246 </span> from-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, <a href='081print.mu.html#L4'>screen</a> +<span id="L246" class="LineNr">246 </span> from-rank:num, quit?, error? <span class="Special"><-</span> <a href='chessboard.mu.html#L312'>read-rank</a> stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L247" class="LineNr">247 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L248" class="LineNr">248 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L249" class="LineNr">249 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">from-rank:offset</span>, from-rank -<span id="L250" class="LineNr">250 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">45/dash</span>, <a href='081print.mu.html#L4'>screen</a> +<span id="L250" class="LineNr">250 </span> error? <span class="Special"><-</span> <a href='chessboard.mu.html#L354'>expect-from-channel</a> stdin, <span class="Constant">45/dash</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L251" class="LineNr">251 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span> -<span id="L252" class="LineNr">252 </span> to-file:num, quit?, error? <span class="Special"><-</span> read-file stdin, <a href='081print.mu.html#L4'>screen</a> +<span id="L252" class="LineNr">252 </span> to-file:num, quit?, error? <span class="Special"><-</span> <a href='chessboard.mu.html#L265'>read-file</a> stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L253" class="LineNr">253 </span> <span class="muControl">return-if</span> quit?:bool, <span class="Constant">0/dummy</span> <span id="L254" class="LineNr">254 </span> <span class="muControl">return-if</span> error?:bool, <span class="Constant">0/dummy</span> <span id="L255" class="LineNr">255 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">to-file:offset</span>, to-file -<span id="L256" class="LineNr">256 </span> to-rank:num, quit?, error? <span class="Special"><-</span> read-rank stdin, <a href='081print.mu.html#L4'>screen</a> +<span id="L256" class="LineNr">256 </span> to-rank:num, quit?, error? <span class="Special"><-</span> <a href='chessboard.mu.html#L312'>read-rank</a> stdin, <a href='081print.mu.html#L4'>screen</a> <span id="L257" class="LineNr">257 </span> <span class="muControl">return-if</span> quit?, <span class="Constant">0/dummy</span> <span id="L258" class="LineNr">258 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span> <span id="L259" class="LineNr">259 </span> *result <span class="Special"><-</span> put *result, <span class="Constant">to-rank:offset</span>, to-rank -<span id="L260" class="LineNr">260 </span> error? <span class="Special"><-</span> expect-from-channel stdin, <span class="Constant">10/newline</span>, <a href='081print.mu.html#L4'>screen</a> +<span id="L260" class="LineNr">260 </span> error? <span class="Special"><-</span> <a href='chessboard.mu.html#L354'>expect-from-channel</a> stdin, <span class="Constant">10/newline</span>, <a href='081print.mu.html#L4'>screen</a> <span id="L261" class="LineNr">261 </span> <span class="muControl">return-if</span> error?, <span class="Constant">0/dummy</span>, <span class="Constant">0/quit</span> <span id="L262" class="LineNr">262 </span>] <span id="L263" class="LineNr">263 </span> <span id="L264" class="LineNr">264 </span><span class="Comment"># valid values for file: 0-7</span> -<span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> read-file stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>file:num, quit:bool, error:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ +<span id="L265" class="LineNr">265 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L265'>read-file</a> stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>file:num, quit:bool, error:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L266" class="LineNr">266 </span> <span class="Constant">local-scope</span> <span id="L267" class="LineNr">267 </span> <span class="Constant">load-ingredients</span> <span id="L268" class="LineNr">268 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -371,7 +371,7 @@ if ('onhashchange' in window) { <span id="L309" class="LineNr">309 </span>] <span id="L310" class="LineNr">310 </span> <span id="L311" class="LineNr">311 </span><span class="Comment"># valid values for rank: 0-7</span> -<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> read-rank stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>rank:num, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ +<span id="L312" class="LineNr">312 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L312'>read-rank</a> stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>rank:num, quit?:bool, error?:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L313" class="LineNr">313 </span> <span class="Constant">local-scope</span> <span id="L314" class="LineNr">314 </span> <span class="Constant">load-ingredients</span> <span id="L315" class="LineNr">315 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -413,7 +413,7 @@ if ('onhashchange' in window) { <span id="L351" class="LineNr">351 </span> <span id="L352" class="LineNr">352 </span><span class="Comment"># read a character from the given channel and check that it's what we expect</span> <span id="L353" class="LineNr">353 </span><span class="Comment"># return true on error</span> -<span id="L354" class="LineNr">354 </span><span class="muRecipe">def</span> expect-from-channel stdin:&:source:char, expected:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ +<span id="L354" class="LineNr">354 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L354'>expect-from-channel</a> stdin:&:source:char, expected:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a><span class="muRecipe"> -> </span>result:bool, stdin:&:source:char, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> [ <span id="L355" class="LineNr">355 </span> <span class="Constant">local-scope</span> <span id="L356" class="LineNr">356 </span> <span class="Constant">load-ingredients</span> <span id="L357" class="LineNr">357 </span> c:char, eof?:bool, stdin <span class="Special"><-</span> read stdin @@ -430,7 +430,7 @@ if ('onhashchange' in window) { <span id="L368" class="LineNr">368 </span> <span class="Constant">local-scope</span> <span id="L369" class="LineNr">369 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> <span id="L370" class="LineNr">370 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> -<span id="L371" class="LineNr">371 </span> read-move-routine:num/routine <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> +<span id="L371" class="LineNr">371 </span> read-move-routine:num/routine <span class="Special"><-</span> start-running <a href='chessboard.mu.html#L237'>read-move</a>, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L372" class="LineNr">372 </span> run [ <span id="L373" class="LineNr">373 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L374" class="LineNr">374 </span> wait-for-routine-to-block read-move-routine @@ -503,7 +503,7 @@ if ('onhashchange' in window) { <span id="L441" class="LineNr">441 </span> <span class="Constant">local-scope</span> <span id="L442" class="LineNr">442 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> <span id="L443" class="LineNr">443 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> -<span id="L444" class="LineNr">444 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> +<span id="L444" class="LineNr">444 </span> read-move-routine:num <span class="Special"><-</span> start-running <a href='chessboard.mu.html#L237'>read-move</a>, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L445" class="LineNr">445 </span> run [ <span id="L446" class="LineNr">446 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L447" class="LineNr">447 </span> wait-for-routine-to-block read-move-routine @@ -531,7 +531,7 @@ if ('onhashchange' in window) { <span id="L469" class="LineNr">469 </span> <span class="Constant">local-scope</span> <span id="L470" class="LineNr">470 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> <span id="L471" class="LineNr">471 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> -<span id="L472" class="LineNr">472 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> +<span id="L472" class="LineNr">472 </span> read-move-routine:num <span class="Special"><-</span> start-running <a href='chessboard.mu.html#L237'>read-move</a>, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L473" class="LineNr">473 </span> run [ <span id="L474" class="LineNr">474 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L475" class="LineNr">475 </span> wait-for-routine-to-block read-move-routine @@ -553,7 +553,7 @@ if ('onhashchange' in window) { <span id="L491" class="LineNr">491 </span> <span class="Constant">local-scope</span> <span id="L492" class="LineNr">492 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> <span id="L493" class="LineNr">493 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> -<span id="L494" class="LineNr">494 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> +<span id="L494" class="LineNr">494 </span> read-move-routine:num <span class="Special"><-</span> start-running <a href='chessboard.mu.html#L237'>read-move</a>, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L495" class="LineNr">495 </span> run [ <span id="L496" class="LineNr">496 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L497" class="LineNr">497 </span> wait-for-routine-to-block read-move-routine @@ -576,7 +576,7 @@ if ('onhashchange' in window) { <span id="L514" class="LineNr">514 </span> <span class="Constant">local-scope</span> <span id="L515" class="LineNr">515 </span> assume-screen <span class="Constant">20/width</span>, <span class="Constant">2/height</span> <span id="L516" class="LineNr">516 </span> source:&:source:char, sink:&:sink:char <span class="Special"><-</span> <a href='075channel.mu.html#L51'>new-channel</a> <span class="Constant">2/capacity</span> -<span id="L517" class="LineNr">517 </span> read-move-routine:num <span class="Special"><-</span> start-running read-move, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> +<span id="L517" class="LineNr">517 </span> read-move-routine:num <span class="Special"><-</span> start-running <a href='chessboard.mu.html#L237'>read-move</a>, source, <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span id="L518" class="LineNr">518 </span> run [ <span id="L519" class="LineNr">519 </span> <span class="Comment"># 'read-move' is waiting for input</span> <span id="L520" class="LineNr">520 </span> wait-for-routine-to-block read-move-routine @@ -595,7 +595,7 @@ if ('onhashchange' in window) { <span id="L533" class="LineNr">533 </span> ] <span id="L534" class="LineNr">534 </span>] <span id="L535" class="LineNr">535 </span> -<span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> make-move board:board, m:&:move<span class="muRecipe"> -> </span>board:board [ +<span id="L536" class="LineNr">536 </span><span class="muRecipe">def</span> <a href='chessboard.mu.html#L536'>make-move</a> board:board, m:&:<a href='chessboard.mu.html#L228'>move</a><span class="muRecipe"> -> </span>board:board [ <span id="L537" class="LineNr">537 </span> <span class="Constant">local-scope</span> <span id="L538" class="LineNr">538 </span> <span class="Constant">load-ingredients</span> <span id="L539" class="LineNr">539 </span> from-file:num <span class="Special"><-</span> get *m, <span class="Constant">from-file:offset</span> @@ -612,12 +612,12 @@ if ('onhashchange' in window) { <span id="L550" class="LineNr">550 </span><span class="muScenario">scenario</span> making-a-move [ <span id="L551" class="LineNr">551 </span> <span class="Constant">local-scope</span> <span id="L552" class="LineNr">552 </span> assume-screen <span class="Constant">30/width</span>, <span class="Constant">12/height</span> -<span id="L553" class="LineNr">553 </span> board:board <span class="Special"><-</span> initial-position -<span id="L554" class="LineNr">554 </span> move:&:move <span class="Special"><-</span> new <span class="Constant">move:type</span> +<span id="L553" class="LineNr">553 </span> board:board <span class="Special"><-</span> <a href='chessboard.mu.html#L179'>initial-position</a> +<span id="L554" class="LineNr">554 </span> <a href='chessboard.mu.html#L228'>move</a>:&:<a href='chessboard.mu.html#L228'>move</a> <span class="Special"><-</span> new <span class="Constant"><a href='chessboard.mu.html#L228'>move</a>:type</span> <span id="L555" class="LineNr">555 </span> *move <span class="Special"><-</span> merge <span class="Constant">6/g</span>, <span class="Constant">1/'2'</span>, <span class="Constant">6/g</span>, <span class="Constant">3/'4'</span> <span id="L556" class="LineNr">556 </span> run [ -<span id="L557" class="LineNr">557 </span> board <span class="Special"><-</span> make-move board, move -<span id="L558" class="LineNr">558 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> print-board <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board +<span id="L557" class="LineNr">557 </span> board <span class="Special"><-</span> <a href='chessboard.mu.html#L536'>make-move</a> board, <a href='chessboard.mu.html#L228'>move</a> +<span id="L558" class="LineNr">558 </span> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a> <span class="Special"><-</span> <a href='chessboard.mu.html#L143'>print-board</a> <a href='081print.mu.html#L4'>screen</a>:&:<a href='081print.mu.html#L4'>screen</a>, board <span id="L559" class="LineNr">559 </span> ] <span id="L560" class="LineNr">560 </span> screen-should-contain [ <span id="L561" class="LineNr">561 </span> <span class="Comment"># 012345678901234567890123456789</span> diff --git a/html/console.mu.html b/html/console.mu.html index ad8ec7c8..60e3eb3e 100644 --- a/html/console.mu.html +++ b/html/console.mu.html @@ -60,7 +60,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span><span class="Comment">#</span> <span id="L3" class="LineNr"> 3 </span><span class="Comment"># Keeps printing 'a' until you press a key or click on the mouse.</span> <span id="L4" class="LineNr"> 4 </span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='console.mu.html#L5'>main</a> [ <span id="L6" class="LineNr"> 6 </span> <span class="Constant">local-scope</span> <span id="L7" class="LineNr"> 7 </span> open-console <span id="L8" class="LineNr"> 8 </span> <span class="Delimiter">{</span> diff --git a/html/counters.mu.html b/html/counters.mu.html index 6736fb72..c4421907 100644 --- a/html/counters.mu.html +++ b/html/counters.mu.html @@ -57,28 +57,28 @@ if ('onhashchange' in window) { <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: maintain multiple counters with isolated lexical scopes</span> <span id="L2" class="LineNr"> 2 </span><span class="Comment"># (spaces)</span> <span id="L3" class="LineNr"> 3 </span> -<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> new-counter n:num<span class="muRecipe"> -> </span><span class="Constant">default-space</span>:space [ +<span id="L4" class="LineNr"> 4 </span><span class="muRecipe">def</span> <a href='counters.mu.html#L4'>new-counter</a> n:num<span class="muRecipe"> -> </span><span class="Constant">default-space</span>:space [ <span id="L5" class="LineNr"> 5 </span> <span class="Constant">default-space</span> <span class="Special"><-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 30</span> <span id="L6" class="LineNr"> 6 </span> <span class="Constant">load-ingredients</span> <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> increment-counter outer:space/names:new-counter, x:num<span class="muRecipe"> -> </span>n:num/space:1 [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='counters.mu.html#L9'>increment-counter</a> outer:space/names:<a href='counters.mu.html#L4'>new-counter</a>, x:num<span class="muRecipe"> -> </span>n:num/space:1 [ <span id="L10" class="LineNr">10 </span> <span class="Constant">local-scope</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">load-ingredients</span> -<span id="L12" class="LineNr">12 </span> 0:space/names:new-counter <span class="Special"><-</span> copy outer <span class="Comment"># setup outer space; it *must* come from 'new-counter'</span> +<span id="L12" class="LineNr">12 </span> 0:space/names:<a href='counters.mu.html#L4'>new-counter</a> <span class="Special"><-</span> copy outer <span class="Comment"># setup outer space; it *must* come from 'new-counter'</span> <span id="L13" class="LineNr">13 </span> n/space:1 <span class="Special"><-</span> add n/space:1, x <span id="L14" class="LineNr">14 </span>] <span id="L15" class="LineNr">15 </span> -<span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> main [ +<span id="L16" class="LineNr">16 </span><span class="muRecipe">def</span> <a href='counters.mu.html#L16'>main</a> [ <span id="L17" class="LineNr">17 </span> <span class="Constant">local-scope</span> <span id="L18" class="LineNr">18 </span> <span class="Comment"># counter A</span> -<span id="L19" class="LineNr">19 </span> a:space <span class="Special"><-</span> new-counter<span class="Constant"> 34</span> +<span id="L19" class="LineNr">19 </span> a:space <span class="Special"><-</span> <a href='counters.mu.html#L4'>new-counter</a><span class="Constant"> 34</span> <span id="L20" class="LineNr">20 </span> <span class="Comment"># counter B</span> -<span id="L21" class="LineNr">21 </span> b:space <span class="Special"><-</span> new-counter<span class="Constant"> 23</span> +<span id="L21" class="LineNr">21 </span> b:space <span class="Special"><-</span> <a href='counters.mu.html#L4'>new-counter</a><span class="Constant"> 23</span> <span id="L22" class="LineNr">22 </span> <span class="Comment"># increment both by 2 but in different ways</span> -<span id="L23" class="LineNr">23 </span> increment-counter a,<span class="Constant"> 1</span> -<span id="L24" class="LineNr">24 </span> b-value:num <span class="Special"><-</span> increment-counter b,<span class="Constant"> 2</span> -<span id="L25" class="LineNr">25 </span> a-value:num <span class="Special"><-</span> increment-counter a,<span class="Constant"> 1</span> +<span id="L23" class="LineNr">23 </span> <a href='counters.mu.html#L9'>increment-counter</a> a,<span class="Constant"> 1</span> +<span id="L24" class="LineNr">24 </span> b-value:num <span class="Special"><-</span> <a href='counters.mu.html#L9'>increment-counter</a> b,<span class="Constant"> 2</span> +<span id="L25" class="LineNr">25 </span> a-value:num <span class="Special"><-</span> <a href='counters.mu.html#L9'>increment-counter</a> a,<span class="Constant"> 1</span> <span id="L26" class="LineNr">26 </span> <span class="Comment"># check results</span> <span id="L27" class="LineNr">27 </span> $print <span class="Constant">[Contents of counters]</span>, <span class="Constant">10/newline</span> <span id="L28" class="LineNr">28 </span> $print <span class="Constant">[a: ]</span>, a-value, <span class="Constant">[ b: ]</span>, b-value, <span class="Constant">10/newline</span> diff --git a/html/display.mu.html b/html/display.mu.html index ce910c73..b1d02462 100644 --- a/html/display.mu.html +++ b/html/display.mu.html @@ -56,7 +56,7 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: managing the display</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='display.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> open-console <span id="L5" class="LineNr"> 5 </span> print-character-to-display<span class="Constant"> 97</span>, <span class="Constant">1/red</span>, <span class="Constant">2/green</span> <span id="L6" class="LineNr"> 6 </span> 1:num/<span class="Special">raw</span>, 2:num/<span class="Special">raw</span> <span class="Special"><-</span> cursor-position-on-display diff --git a/html/example1.mu.html b/html/example1.mu.html index 87a34370..61462817 100644 --- a/html/example1.mu.html +++ b/html/example1.mu.html @@ -53,7 +53,7 @@ if ('onhashchange' in window) { </head> <body onload='JumpToLine();'> <pre id='vimCodeElement'> -<span id="L1" class="LineNr">1 </span><span class="muRecipe">def</span> example1 [ +<span id="L1" class="LineNr">1 </span><span class="muRecipe">def</span> <a href='example1.mu.html#L1'>example1</a> [ <span id="L2" class="LineNr">2 </span> <span class="Constant">local-scope</span> <span id="L3" class="LineNr">3 </span> a:num <span class="Special"><-</span> add<span class="Constant"> 2</span>,<span class="Constant"> 2</span> <span id="L4" class="LineNr">4 </span> a <span class="Special"><-</span> multiply a,<span class="Constant"> 3</span> diff --git a/html/factorial.mu.html b/html/factorial.mu.html index 04ab8228..1133ccfe 100644 --- a/html/factorial.mu.html +++ b/html/factorial.mu.html @@ -59,14 +59,14 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: compute the factorial of 5</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='factorial.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> <span class="Constant">local-scope</span> -<span id="L5" class="LineNr"> 5 </span> x:num <span class="Special"><-</span> factorial<span class="Constant"> 5</span> +<span id="L5" class="LineNr"> 5 </span> x:num <span class="Special"><-</span> <a href='factorial.mu.html#L10'>factorial</a><span class="Constant"> 5</span> <span id="L6" class="LineNr"> 6 </span> $print <span class="Constant">[result: ]</span>, x, <span class="Constant">[ </span> <span id="L7" class="LineNr"> 7 </span><span class="Constant">]</span> <span id="L8" class="LineNr"> 8 </span>] <span id="L9" class="LineNr"> 9 </span> -<span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -> </span>result:num [ +<span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> <a href='factorial.mu.html#L10'>factorial</a> n:num<span class="muRecipe"> -> </span>result:num [ <span id="L11" class="LineNr">11 </span> <span class="Constant">local-scope</span> <span id="L12" class="LineNr">12 </span> <span class="Constant">load-ingredients</span> <span id="L13" class="LineNr">13 </span> <span class="Delimiter">{</span> @@ -77,14 +77,14 @@ if ('onhashchange' in window) { <span id="L18" class="LineNr">18 </span> <span class="Delimiter">}</span> <span id="L19" class="LineNr">19 </span> <span class="Comment"># return n * factorial(n-1)</span> <span id="L20" class="LineNr">20 </span> x:num <span class="Special"><-</span> subtract n,<span class="Constant"> 1</span> -<span id="L21" class="LineNr">21 </span> subresult:num <span class="Special"><-</span> factorial x +<span id="L21" class="LineNr">21 </span> subresult:num <span class="Special"><-</span> <a href='factorial.mu.html#L10'>factorial</a> x <span id="L22" class="LineNr">22 </span> result <span class="Special"><-</span> multiply subresult, n <span id="L23" class="LineNr">23 </span>] <span id="L24" class="LineNr">24 </span> <span id="L25" class="LineNr">25 </span><span class="Comment"># unit test</span> <span id="L26" class="LineNr">26 </span><span class="muScenario">scenario</span> factorial-test [ <span id="L27" class="LineNr">27 </span> run [ -<span id="L28" class="LineNr">28 </span> 1:num <span class="Special"><-</span> factorial<span class="Constant"> 5</span> +<span id="L28" class="LineNr">28 </span> 1:num <span class="Special"><-</span> <a href='factorial.mu.html#L10'>factorial</a><span class="Constant"> 5</span> <span id="L29" class="LineNr">29 </span> ] <span id="L30" class="LineNr">30 </span> memory-should-contain [ <span id="L31" class="LineNr">31 </span> <span class="Constant"> 1</span> <span class="Special"><-</span><span class="Constant"> 120</span> diff --git a/html/filesystem.mu.html b/html/filesystem.mu.html index 30b55ee2..6e04a561 100644 --- a/html/filesystem.mu.html +++ b/html/filesystem.mu.html @@ -61,7 +61,7 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Comment"># before running it, put some text into /tmp/mu-x</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment"># after running it, check /tmp/mu-y</span> <span id="L5" class="LineNr"> 5 </span> -<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ +<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> <a href='filesystem.mu.html#L6'>main</a> [ <span id="L7" class="LineNr"> 7 </span> <span class="Constant">local-scope</span> <span id="L8" class="LineNr"> 8 </span> source-file:&:source:char <span class="Special"><-</span> <a href='088file.mu.html#L21'>start-reading</a> <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-x]</span> <span id="L9" class="LineNr"> 9 </span> sink-file:&:sink:char, write-routine:num <span class="Special"><-</span> <a href='088file.mu.html#L105'>start-writing</a> <span class="Constant">0/real-filesystem</span>, <span class="Constant">[/tmp/mu-y]</span> diff --git a/html/fork.mu.html b/html/fork.mu.html index 3aa13f4e..0e2c653e 100644 --- a/html/fork.mu.html +++ b/html/fork.mu.html @@ -57,15 +57,15 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: running multiple routines</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ -<span id="L4" class="LineNr"> 4 </span> start-running thread2 +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='fork.mu.html#L3'>main</a> [ +<span id="L4" class="LineNr"> 4 </span> start-running <a href='fork.mu.html#L11'>thread2</a> <span id="L5" class="LineNr"> 5 </span> <span class="Delimiter">{</span> <span id="L6" class="LineNr"> 6 </span> $print<span class="Constant"> 34</span> <span id="L7" class="LineNr"> 7 </span> <span class="muControl">loop</span> <span id="L8" class="LineNr"> 8 </span> <span class="Delimiter">}</span> <span id="L9" class="LineNr"> 9 </span>] <span id="L10" class="LineNr">10 </span> -<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> thread2 [ +<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> <a href='fork.mu.html#L11'>thread2</a> [ <span id="L12" class="LineNr">12 </span> <span class="Delimiter">{</span> <span id="L13" class="LineNr">13 </span> $print<span class="Constant"> 35</span> <span id="L14" class="LineNr">14 </span> <span class="muControl">loop</span> diff --git a/html/global.mu.html b/html/global.mu.html index 0e1ac277..41bf228e 100644 --- a/html/global.mu.html +++ b/html/global.mu.html @@ -56,15 +56,15 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: creating and using global variables</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='global.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> <span class="Comment"># allocate 5 locations for globals</span> <span id="L5" class="LineNr"> 5 </span> <span class="Constant">global-space</span>:space <span class="Special"><-</span> new <span class="Constant">location:type</span>,<span class="Constant"> 5</span> <span id="L6" class="LineNr"> 6 </span> <span class="Comment"># read to globals by using /space:global</span> <span id="L7" class="LineNr"> 7 </span> <span class="Special">1:num/space:global</span> <span class="Special"><-</span> copy<span class="Constant"> 3</span> -<span id="L8" class="LineNr"> 8 </span> foo +<span id="L8" class="LineNr"> 8 </span> <a href='global.mu.html#L11'>foo</a> <span id="L9" class="LineNr"> 9 </span>] <span id="L10" class="LineNr">10 </span> -<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> foo [ +<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> <a href='global.mu.html#L11'>foo</a> [ <span id="L12" class="LineNr">12 </span> <span class="Comment"># ditto for writing to globals</span> <span id="L13" class="LineNr">13 </span> $print <span class="Special">1:num/space:global</span>, <span class="Constant">10/newline</span> <span id="L14" class="LineNr">14 </span>] diff --git a/html/http-client.mu.html b/html/http-client.mu.html index 29f1a72b..92e0df2d 100644 --- a/html/http-client.mu.html +++ b/html/http-client.mu.html @@ -58,7 +58,7 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># example program: reading a URL over HTTP</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='http-client.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> <span class="Constant">local-scope</span> <span id="L5" class="LineNr"> 5 </span> google:&:source:char <span class="Special"><-</span> <a href='092socket.mu.html#L69'>start-reading-from-network</a> <span class="Constant">0/real-resources</span>, <span class="Constant">[google.com/]</span> <span id="L6" class="LineNr"> 6 </span> n:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> diff --git a/html/http-server.mu.html b/html/http-server.mu.html index 7a42603a..ac913d62 100644 --- a/html/http-server.mu.html +++ b/html/http-server.mu.html @@ -64,7 +64,7 @@ if ('onhashchange' in window) { <span id="L7" class="LineNr"> 7 </span><span class="Comment"># After running it, navigate to localhost:8080. Your browser should display</span> <span id="L8" class="LineNr"> 8 </span><span class="Comment"># "SUCCESS!" and the server will terminate after one connection.</span> <span id="L9" class="LineNr"> 9 </span> -<span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> main [ +<span id="L10" class="LineNr">10 </span><span class="muRecipe">def</span> <a href='http-server.mu.html#L10'>main</a> [ <span id="L11" class="LineNr">11 </span> <span class="Constant">local-scope</span> <span id="L12" class="LineNr">12 </span> socket:num <span class="Special"><-</span> $open-server-socket <span class="Constant">8080/port</span> <span id="L13" class="LineNr">13 </span> $print <span class="Constant">[Mu socket creation returned ]</span>, socket, <span class="Constant">10/newline</span> diff --git a/html/immutable-error.mu.html b/html/immutable-error.mu.html index cbd3d349..83509618 100644 --- a/html/immutable-error.mu.html +++ b/html/immutable-error.mu.html @@ -56,13 +56,13 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># compare mutable.mu</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='immutable-error.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> <span class="Constant">local-scope</span> <span id="L5" class="LineNr"> 5 </span> x:&:num <span class="Special"><-</span> new <span class="Constant">number:type</span> -<span id="L6" class="LineNr"> 6 </span> foo x +<span id="L6" class="LineNr"> 6 </span> <a href='immutable-error.mu.html#L9'>foo</a> x <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo x:&:num [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='immutable-error.mu.html#L9'>foo</a> x:&:num [ <span id="L10" class="LineNr">10 </span> <span class="Constant">local-scope</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">load-ingredients</span> <span id="L12" class="LineNr">12 </span> *x <span class="Special"><-</span> copy<span class="Constant"> 34</span> <span class="Comment"># will cause an error because x is immutable in this function</span> diff --git a/html/lambda-to-mu.mu.html b/html/lambda-to-mu.mu.html index 4d79fcb3..2aa7689b 100644 --- a/html/lambda-to-mu.mu.html +++ b/html/lambda-to-mu.mu.html @@ -72,7 +72,7 @@ if ('onhashchange' in window) { <span id="L10" class="LineNr"> 10 </span><span class="muScenario">scenario</span> convert-lambda [ <span id="L11" class="LineNr"> 11 </span> run [ <span id="L12" class="LineNr"> 12 </span> <span class="Constant">local-scope</span> -<span id="L13" class="LineNr"> 13 </span> 1:text/<span class="Special">raw</span> <span class="Special"><-</span> lambda-to-mu <span class="Constant">[(add a (multiply b c))]</span> +<span id="L13" class="LineNr"> 13 </span> 1:text/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L22'>lambda-to-mu</a> <span class="Constant">[(add a (multiply b c))]</span> <span id="L14" class="LineNr"> 14 </span> 2:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *1:text/<span class="Special">raw</span> <span id="L15" class="LineNr"> 15 </span> ] <span id="L16" class="LineNr"> 16 </span> memory-should-contain [ @@ -81,60 +81,60 @@ if ('onhashchange' in window) { <span id="L19" class="LineNr"> 19 </span> ] <span id="L20" class="LineNr"> 20 </span>] <span id="L21" class="LineNr"> 21 </span> -<span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> lambda-to-mu in:text<span class="muRecipe"> -> </span>out:text [ +<span id="L22" class="LineNr"> 22 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L22'>lambda-to-mu</a> in:text<span class="muRecipe"> -> </span>out:text [ <span id="L23" class="LineNr"> 23 </span> <span class="Constant">local-scope</span> <span id="L24" class="LineNr"> 24 </span> <span class="Constant">load-ingredients</span> <span id="L25" class="LineNr"> 25 </span> out <span class="Special"><-</span> copy<span class="Constant"> 0</span> -<span id="L26" class="LineNr"> 26 </span> cells:&:cell <span class="Special"><-</span> parse in +<span id="L26" class="LineNr"> 26 </span> cells:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse in <span id="L27" class="LineNr"> 27 </span> out <span class="Special"><-</span> to-mu cells <span id="L28" class="LineNr"> 28 </span>] <span id="L29" class="LineNr"> 29 </span> <span id="L30" class="LineNr"> 30 </span><span class="Comment"># 'parse' will turn lambda expressions into trees made of cells</span> -<span id="L31" class="LineNr"> 31 </span><span class="muData">exclusive-container</span> cell [ +<span id="L31" class="LineNr"> 31 </span><span class="muData">exclusive-container</span> <a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L32" class="LineNr"> 32 </span> atom:text -<span id="L33" class="LineNr"> 33 </span> pair:pair +<span id="L33" class="LineNr"> 33 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a>:<a href='lambda-to-mu.mu.html#L37'>pair</a> <span id="L34" class="LineNr"> 34 </span>] <span id="L35" class="LineNr"> 35 </span> <span id="L36" class="LineNr"> 36 </span><span class="Comment"># printed below as < first | rest ></span> -<span id="L37" class="LineNr"> 37 </span><span class="muData">container</span> pair [ -<span id="L38" class="LineNr"> 38 </span> first:&:cell -<span id="L39" class="LineNr"> 39 </span> <a href='064list.mu.html#L25'>rest</a>:&:cell +<span id="L37" class="LineNr"> 37 </span><span class="muData">container</span> <a href='lambda-to-mu.mu.html#L37'>pair</a> [ +<span id="L38" class="LineNr"> 38 </span> first:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> +<span id="L39" class="LineNr"> 39 </span> rest:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span id="L40" class="LineNr"> 40 </span>] <span id="L41" class="LineNr"> 41 </span> -<span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> new-atom name:text<span class="muRecipe"> -> </span>result:&:cell [ +<span id="L42" class="LineNr"> 42 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> name:text<span class="muRecipe"> -> </span>result:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L43" class="LineNr"> 43 </span> <span class="Constant">local-scope</span> <span id="L44" class="LineNr"> 44 </span> <span class="Constant">load-ingredients</span> -<span id="L45" class="LineNr"> 45 </span> result <span class="Special"><-</span> new <span class="Constant">cell:type</span> +<span id="L45" class="LineNr"> 45 </span> result <span class="Special"><-</span> new <span class="Constant"><a href='lambda-to-mu.mu.html#L31'>cell</a>:type</span> <span id="L46" class="LineNr"> 46 </span> *result <span class="Special"><-</span> merge <span class="Constant">0/tag:atom</span>, name <span id="L47" class="LineNr"> 47 </span>] <span id="L48" class="LineNr"> 48 </span> -<span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> new-pair a:&:cell, b:&:cell<span class="muRecipe"> -> </span>result:&:cell [ +<span id="L49" class="LineNr"> 49 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L49'>new-pair</a> a:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, b:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>result:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L50" class="LineNr"> 50 </span> <span class="Constant">local-scope</span> <span id="L51" class="LineNr"> 51 </span> <span class="Constant">load-ingredients</span> -<span id="L52" class="LineNr"> 52 </span> result <span class="Special"><-</span> new <span class="Constant">cell:type</span> -<span id="L53" class="LineNr"> 53 </span> *result <span class="Special"><-</span> merge <span class="Constant">1/tag:pair</span>, a/first, b/rest +<span id="L52" class="LineNr"> 52 </span> result <span class="Special"><-</span> new <span class="Constant"><a href='lambda-to-mu.mu.html#L31'>cell</a>:type</span> +<span id="L53" class="LineNr"> 53 </span> *result <span class="Special"><-</span> merge <span class="Constant">1/tag:<a href='lambda-to-mu.mu.html#L37'>pair</a></span>, a/first, b/rest <span id="L54" class="LineNr"> 54 </span>] <span id="L55" class="LineNr"> 55 </span> -<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> is-atom? x:&:cell<span class="muRecipe"> -> </span>result:bool [ +<span id="L56" class="LineNr"> 56 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L56'>is-atom?</a> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>result:bool [ <span id="L57" class="LineNr"> 57 </span> <span class="Constant">local-scope</span> <span id="L58" class="LineNr"> 58 </span> <span class="Constant">load-ingredients</span> <span id="L59" class="LineNr"> 59 </span> <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span> <span id="L60" class="LineNr"> 60 </span> _, result <span class="Special"><-</span> maybe-convert *x, <span class="Constant">atom:variant</span> <span id="L61" class="LineNr"> 61 </span>] <span id="L62" class="LineNr"> 62 </span> -<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> is-pair? x:&:cell<span class="muRecipe"> -> </span>result:bool [ +<span id="L63" class="LineNr"> 63 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>result:bool [ <span id="L64" class="LineNr"> 64 </span> <span class="Constant">local-scope</span> <span id="L65" class="LineNr"> 65 </span> <span class="Constant">load-ingredients</span> <span id="L66" class="LineNr"> 66 </span> <span class="muControl">return-unless</span> x, <span class="Constant">0/false</span> -<span id="L67" class="LineNr"> 67 </span> _, result <span class="Special"><-</span> maybe-convert *x, <span class="Constant">pair:variant</span> +<span id="L67" class="LineNr"> 67 </span> _, result <span class="Special"><-</span> maybe-convert *x, <span class="Constant"><a href='lambda-to-mu.mu.html#L37'>pair</a>:variant</span> <span id="L68" class="LineNr"> 68 </span>] <span id="L69" class="LineNr"> 69 </span> <span id="L70" class="LineNr"> 70 </span><span class="muScenario">scenario</span> atom-is-not-pair [ <span id="L71" class="LineNr"> 71 </span> <span class="Constant">local-scope</span> <span id="L72" class="LineNr"> 72 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> -<span id="L73" class="LineNr"> 73 </span> x:&:cell <span class="Special"><-</span> new-atom s -<span id="L74" class="LineNr"> 74 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-atom? x -<span id="L75" class="LineNr"> 75 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x +<span id="L73" class="LineNr"> 73 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> s +<span id="L74" class="LineNr"> 74 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L56'>is-atom?</a> x +<span id="L75" class="LineNr"> 75 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x <span id="L76" class="LineNr"> 76 </span> memory-should-contain [ <span id="L77" class="LineNr"> 77 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span id="L78" class="LineNr"> 78 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 0</span> @@ -145,73 +145,73 @@ if ('onhashchange' in window) { <span id="L83" class="LineNr"> 83 </span> <span class="Constant">local-scope</span> <span id="L84" class="LineNr"> 84 </span> <span class="Comment"># construct (a . nil)</span> <span id="L85" class="LineNr"> 85 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> -<span id="L86" class="LineNr"> 86 </span> x:&:cell <span class="Special"><-</span> new-atom s -<span id="L87" class="LineNr"> 87 </span> y:&:cell <span class="Special"><-</span> new-pair x, <span class="Constant">0/nil</span> -<span id="L88" class="LineNr"> 88 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-atom? y -<span id="L89" class="LineNr"> 89 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? y +<span id="L86" class="LineNr"> 86 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> s +<span id="L87" class="LineNr"> 87 </span> y:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L49'>new-pair</a> x, <span class="Constant">0/nil</span> +<span id="L88" class="LineNr"> 88 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L56'>is-atom?</a> y +<span id="L89" class="LineNr"> 89 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> y <span id="L90" class="LineNr"> 90 </span> memory-should-contain [ <span id="L91" class="LineNr"> 91 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span id="L92" class="LineNr"> 92 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span id="L93" class="LineNr"> 93 </span> ] <span id="L94" class="LineNr"> 94 </span>] <span id="L95" class="LineNr"> 95 </span> -<span id="L96" class="LineNr"> 96 </span><span class="muRecipe">def</span> atom-match? x:&:cell, pat:text<span class="muRecipe"> -> </span>result:bool [ +<span id="L96" class="LineNr"> 96 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L96'>atom-match?</a> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, pat:text<span class="muRecipe"> -> </span>result:bool [ <span id="L97" class="LineNr"> 97 </span> <span class="Constant">local-scope</span> <span id="L98" class="LineNr"> 98 </span> <span class="Constant">load-ingredients</span> -<span id="L99" class="LineNr"> 99 </span> s:text, is-atom?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant">atom:variant</span> -<span id="L100" class="LineNr">100 </span> <span class="muControl">return-unless</span> is-atom?, <span class="Constant">0/false</span> +<span id="L99" class="LineNr"> 99 </span> s:text, <a href='lambda-to-mu.mu.html#L56'>is-atom?</a>:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant">atom:variant</span> +<span id="L100" class="LineNr">100 </span> <span class="muControl">return-unless</span> <a href='lambda-to-mu.mu.html#L56'>is-atom?</a>, <span class="Constant">0/false</span> <span id="L101" class="LineNr">101 </span> result <span class="Special"><-</span> equal pat, s <span id="L102" class="LineNr">102 </span>] <span id="L103" class="LineNr">103 </span> <span id="L104" class="LineNr">104 </span><span class="muScenario">scenario</span> atom-match [ <span id="L105" class="LineNr">105 </span> <span class="Constant">local-scope</span> -<span id="L106" class="LineNr">106 </span> x:&:cell <span class="Special"><-</span> new-atom <span class="Constant">[abc]</span> -<span id="L107" class="LineNr">107 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> atom-match? x, <span class="Constant">[abc]</span> +<span id="L106" class="LineNr">106 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> <span class="Constant">[abc]</span> +<span id="L107" class="LineNr">107 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L96'>atom-match?</a> x, <span class="Constant">[abc]</span> <span id="L108" class="LineNr">108 </span> memory-should-contain [ <span id="L109" class="LineNr">109 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span id="L110" class="LineNr">110 </span> ] <span id="L111" class="LineNr">111 </span>] <span id="L112" class="LineNr">112 </span> -<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> first x:&:cell<span class="muRecipe"> -> </span>result:&:cell [ +<span id="L113" class="LineNr">113 </span><span class="muRecipe">def</span> first x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>result:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L114" class="LineNr">114 </span> <span class="Constant">local-scope</span> <span id="L115" class="LineNr">115 </span> <span class="Constant">load-ingredients</span> -<span id="L116" class="LineNr">116 </span> pair:pair, pair?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant">pair:variant</span> +<span id="L116" class="LineNr">116 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a>:<a href='lambda-to-mu.mu.html#L37'>pair</a>, pair?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant"><a href='lambda-to-mu.mu.html#L37'>pair</a>:variant</span> <span id="L117" class="LineNr">117 </span> <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span> -<span id="L118" class="LineNr">118 </span> result <span class="Special"><-</span> get pair, <span class="Constant">first:offset</span> +<span id="L118" class="LineNr">118 </span> result <span class="Special"><-</span> get <a href='lambda-to-mu.mu.html#L37'>pair</a>, <span class="Constant">first:offset</span> <span id="L119" class="LineNr">119 </span>] <span id="L120" class="LineNr">120 </span> -<span id="L121" class="LineNr">121 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L25'>rest</a> x:&:cell<span class="muRecipe"> -> </span>result:&:cell [ +<span id="L121" class="LineNr">121 </span><span class="muRecipe">def</span> rest x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>result:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L122" class="LineNr">122 </span> <span class="Constant">local-scope</span> <span id="L123" class="LineNr">123 </span> <span class="Constant">load-ingredients</span> -<span id="L124" class="LineNr">124 </span> pair:pair, pair?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant">pair:variant</span> +<span id="L124" class="LineNr">124 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a>:<a href='lambda-to-mu.mu.html#L37'>pair</a>, pair?:bool <span class="Special"><-</span> maybe-convert *x, <span class="Constant"><a href='lambda-to-mu.mu.html#L37'>pair</a>:variant</span> <span id="L125" class="LineNr">125 </span> <span class="muControl">return-unless</span> pair?, <span class="Constant">0/nil</span> -<span id="L126" class="LineNr">126 </span> result <span class="Special"><-</span> get pair, <span class="Constant"><a href='064list.mu.html#L25'>rest</a>:offset</span> +<span id="L126" class="LineNr">126 </span> result <span class="Special"><-</span> get <a href='lambda-to-mu.mu.html#L37'>pair</a>, <span class="Constant">rest:offset</span> <span id="L127" class="LineNr">127 </span>] <span id="L128" class="LineNr">128 </span> -<span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> set-first base:&:cell, new-first:&:cell<span class="muRecipe"> -> </span>base:&:cell [ +<span id="L129" class="LineNr">129 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L129'>set-first</a> base:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, new-first:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>base:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L130" class="LineNr">130 </span> <span class="Constant">local-scope</span> <span id="L131" class="LineNr">131 </span> <span class="Constant">load-ingredients</span> -<span id="L132" class="LineNr">132 </span> pair:pair, is-pair?:bool <span class="Special"><-</span> maybe-convert *base, <span class="Constant">pair:variant</span> -<span id="L133" class="LineNr">133 </span> <span class="muControl">return-unless</span> is-pair? -<span id="L134" class="LineNr">134 </span> pair <span class="Special"><-</span> put pair, <span class="Constant">first:offset</span>, new-first -<span id="L135" class="LineNr">135 </span> *base <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, pair +<span id="L132" class="LineNr">132 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a>:<a href='lambda-to-mu.mu.html#L37'>pair</a>, <a href='lambda-to-mu.mu.html#L63'>is-pair?</a>:bool <span class="Special"><-</span> maybe-convert *base, <span class="Constant"><a href='lambda-to-mu.mu.html#L37'>pair</a>:variant</span> +<span id="L133" class="LineNr">133 </span> <span class="muControl">return-unless</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> +<span id="L134" class="LineNr">134 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a> <span class="Special"><-</span> put <a href='lambda-to-mu.mu.html#L37'>pair</a>, <span class="Constant">first:offset</span>, new-first +<span id="L135" class="LineNr">135 </span> *base <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, <a href='lambda-to-mu.mu.html#L37'>pair</a> <span id="L136" class="LineNr">136 </span>] <span id="L137" class="LineNr">137 </span> -<span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> set-rest base:&:cell, new-rest:&:cell<span class="muRecipe"> -> </span>base:&:cell [ +<span id="L138" class="LineNr">138 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L138'>set-rest</a> base:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, new-rest:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>base:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L139" class="LineNr">139 </span> <span class="Constant">local-scope</span> <span id="L140" class="LineNr">140 </span> <span class="Constant">load-ingredients</span> -<span id="L141" class="LineNr">141 </span> pair:pair, is-pair?:bool <span class="Special"><-</span> maybe-convert *base, <span class="Constant">pair:variant</span> -<span id="L142" class="LineNr">142 </span> <span class="muControl">return-unless</span> is-pair? -<span id="L143" class="LineNr">143 </span> pair <span class="Special"><-</span> put pair, <span class="Constant"><a href='064list.mu.html#L25'>rest</a>:offset</span>, new-rest -<span id="L144" class="LineNr">144 </span> *base <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, pair +<span id="L141" class="LineNr">141 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a>:<a href='lambda-to-mu.mu.html#L37'>pair</a>, <a href='lambda-to-mu.mu.html#L63'>is-pair?</a>:bool <span class="Special"><-</span> maybe-convert *base, <span class="Constant"><a href='lambda-to-mu.mu.html#L37'>pair</a>:variant</span> +<span id="L142" class="LineNr">142 </span> <span class="muControl">return-unless</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> +<span id="L143" class="LineNr">143 </span> <a href='lambda-to-mu.mu.html#L37'>pair</a> <span class="Special"><-</span> put <a href='lambda-to-mu.mu.html#L37'>pair</a>, <span class="Constant">rest:offset</span>, new-rest +<span id="L144" class="LineNr">144 </span> *base <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, <a href='lambda-to-mu.mu.html#L37'>pair</a> <span id="L145" class="LineNr">145 </span>] <span id="L146" class="LineNr">146 </span> <span id="L147" class="LineNr">147 </span><span class="muScenario">scenario</span> cell-operations-on-atom [ <span id="L148" class="LineNr">148 </span> <span class="Constant">local-scope</span> <span id="L149" class="LineNr">149 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> -<span id="L150" class="LineNr">150 </span> x:&:cell <span class="Special"><-</span> new-atom s -<span id="L151" class="LineNr">151 </span> 10:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> first x -<span id="L152" class="LineNr">152 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L150" class="LineNr">150 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> s +<span id="L151" class="LineNr">151 </span> 10:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> first x +<span id="L152" class="LineNr">152 </span> 11:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x <span id="L153" class="LineNr">153 </span> memory-should-contain [ <span id="L154" class="LineNr">154 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># first is nil</span> <span id="L155" class="LineNr">155 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># rest is nil</span> @@ -222,11 +222,11 @@ if ('onhashchange' in window) { <span id="L160" class="LineNr">160 </span> <span class="Constant">local-scope</span> <span id="L161" class="LineNr">161 </span> <span class="Comment"># construct (a . nil)</span> <span id="L162" class="LineNr">162 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> -<span id="L163" class="LineNr">163 </span> x:&:cell <span class="Special"><-</span> new-atom s -<span id="L164" class="LineNr">164 </span> y:&:cell <span class="Special"><-</span> new-pair x, <span class="Constant">0/nil</span> -<span id="L165" class="LineNr">165 </span> x2:&:cell <span class="Special"><-</span> first y +<span id="L163" class="LineNr">163 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> s +<span id="L164" class="LineNr">164 </span> y:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L49'>new-pair</a> x, <span class="Constant">0/nil</span> +<span id="L165" class="LineNr">165 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first y <span id="L166" class="LineNr">166 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> equal x, x2 -<span id="L167" class="LineNr">167 </span> 11:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> y +<span id="L167" class="LineNr">167 </span> 11:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest y <span id="L168" class="LineNr">168 </span> memory-should-contain [ <span id="L169" class="LineNr">169 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># first is correct</span> <span id="L170" class="LineNr">170 </span> <span class="Constant"> 11</span> <span class="Special"><-</span><span class="Constant"> 0</span> <span class="Comment"># rest is nil</span> @@ -235,7 +235,7 @@ if ('onhashchange' in window) { <span id="L173" class="LineNr">173 </span> <span id="L174" class="LineNr">174 </span><span class="SalientComment">## convert lambda text to a tree of cells</span> <span id="L175" class="LineNr">175 </span> -<span id="L176" class="LineNr">176 </span><span class="muRecipe">def</span> parse in:text<span class="muRecipe"> -> </span>out:&:cell [ +<span id="L176" class="LineNr">176 </span><span class="muRecipe">def</span> parse in:text<span class="muRecipe"> -> </span>out:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> [ <span id="L177" class="LineNr">177 </span> <span class="Constant">local-scope</span> <span id="L178" class="LineNr">178 </span> <span class="Constant">load-ingredients</span> <span id="L179" class="LineNr">179 </span> s:&:stream:char <span class="Special"><-</span> <a href='066stream.mu.html#L7'>new-stream</a> in @@ -243,11 +243,11 @@ if ('onhashchange' in window) { <span id="L181" class="LineNr">181 </span> trace<span class="Constant"> 2</span>, <span class="Constant">[app/parse]</span>, out <span id="L182" class="LineNr">182 </span>] <span id="L183" class="LineNr">183 </span> -<span id="L184" class="LineNr">184 </span><span class="muRecipe">def</span> parse in:&:stream:char<span class="muRecipe"> -> </span>out:&:cell, in:&:stream:char [ +<span id="L184" class="LineNr">184 </span><span class="muRecipe">def</span> parse in:&:stream:char<span class="muRecipe"> -> </span>out:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, in:&:stream:char [ <span id="L185" class="LineNr">185 </span> <span class="Constant">local-scope</span> <span id="L186" class="LineNr">186 </span> <span class="Constant">load-ingredients</span> <span id="L187" class="LineNr">187 </span> <span class="Comment"># skip whitespace</span> -<span id="L188" class="LineNr">188 </span> in <span class="Special"><-</span> skip-whitespace in +<span id="L188" class="LineNr">188 </span> in <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L274'>skip-whitespace</a> in <span id="L189" class="LineNr">189 </span> c:char, eof?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L190" class="LineNr">190 </span> <span class="muControl">return-if</span> eof?, <span class="Constant">0/nil</span> <span id="L191" class="LineNr">191 </span> pair?:bool <span class="Special"><-</span> equal c, <span class="Constant">40/open-paren</span> @@ -269,13 +269,13 @@ if ('onhashchange' in window) { <span id="L207" class="LineNr">207 </span> <span class="muControl">loop</span> <span id="L208" class="LineNr">208 </span> <span class="Delimiter">}</span> <span id="L209" class="LineNr">209 </span> s:text <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf -<span id="L210" class="LineNr">210 </span> out <span class="Special"><-</span> new-atom s +<span id="L210" class="LineNr">210 </span> out <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L42'>new-atom</a> s <span id="L211" class="LineNr">211 </span> <span class="Delimiter">}</span> <span id="L212" class="LineNr">212 </span> <span class="Delimiter">{</span> <span id="L213" class="LineNr">213 </span> <span class="muControl">break-unless</span> pair? <span id="L214" class="LineNr">214 </span> <span class="Comment"># pair</span> <span id="L215" class="LineNr">215 </span> read in <span class="Comment"># skip the open-paren</span> -<span id="L216" class="LineNr">216 </span> out <span class="Special"><-</span> new <span class="Constant">cell:type</span> <span class="Comment"># start out with nil</span> +<span id="L216" class="LineNr">216 </span> out <span class="Special"><-</span> new <span class="Constant"><a href='lambda-to-mu.mu.html#L31'>cell</a>:type</span> <span class="Comment"># start out with nil</span> <span id="L217" class="LineNr">217 </span> <span class="Comment"># read in first element of pair</span> <span id="L218" class="LineNr">218 </span> <span class="Delimiter">{</span> <span id="L219" class="LineNr">219 </span> end?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in @@ -284,13 +284,13 @@ if ('onhashchange' in window) { <span id="L222" class="LineNr">222 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L223" class="LineNr">223 </span> close-paren?:bool <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L224" class="LineNr">224 </span> <span class="muControl">break-if</span> close-paren? -<span id="L225" class="LineNr">225 </span> first:&:cell, in <span class="Special"><-</span> parse in +<span id="L225" class="LineNr">225 </span> first:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, in <span class="Special"><-</span> parse in <span id="L226" class="LineNr">226 </span> *out <span class="Special"><-</span> merge <span class="Constant">1/pair</span>, first, <span class="Constant">0/nil</span> <span id="L227" class="LineNr">227 </span> <span class="Delimiter">}</span> <span id="L228" class="LineNr">228 </span> <span class="Comment"># read in any remaining elements</span> -<span id="L229" class="LineNr">229 </span> curr:&:cell <span class="Special"><-</span> copy out +<span id="L229" class="LineNr">229 </span> curr:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> copy out <span id="L230" class="LineNr">230 </span> <span class="Delimiter">{</span> -<span id="L231" class="LineNr">231 </span> in <span class="Special"><-</span> skip-whitespace in +<span id="L231" class="LineNr">231 </span> in <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L274'>skip-whitespace</a> in <span id="L232" class="LineNr">232 </span> end?:bool <span class="Special"><-</span> <a href='066stream.mu.html#L67'>end-of-stream?</a> in <span id="L233" class="LineNr">233 </span> not-end?:bool <span class="Special"><-</span> not end? <span id="L234" class="LineNr">234 </span> assert not-end?, <span class="Constant">[unbalanced '(' in expression]</span> @@ -303,26 +303,26 @@ if ('onhashchange' in window) { <span id="L241" class="LineNr">241 </span> <span class="muControl">break</span> <span class="Constant">+end-pair</span> <span id="L242" class="LineNr">242 </span> <span class="Delimiter">}</span> <span id="L243" class="LineNr">243 </span> <span class="Comment"># still here? read next element of pair</span> -<span id="L244" class="LineNr">244 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:cell, in <span class="Special"><-</span> parse in -<span id="L245" class="LineNr">245 </span> is-dot?:bool <span class="Special"><-</span> atom-match? <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">[.]</span> +<span id="L244" class="LineNr">244 </span> <a href='065duplex_list.mu.html#L29'>next</a>:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, in <span class="Special"><-</span> parse in +<span id="L245" class="LineNr">245 </span> is-dot?:bool <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L96'>atom-match?</a> <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">[.]</span> <span id="L246" class="LineNr">246 </span> <span class="Delimiter">{</span> <span id="L247" class="LineNr">247 </span> <span class="muControl">break-if</span> is-dot? -<span id="L248" class="LineNr">248 </span> next-curr:&:cell <span class="Special"><-</span> new-pair <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span> -<span id="L249" class="LineNr">249 </span> curr <span class="Special"><-</span> set-rest curr, next-curr -<span id="L250" class="LineNr">250 </span> curr <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> curr +<span id="L248" class="LineNr">248 </span> next-curr:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L49'>new-pair</a> <a href='065duplex_list.mu.html#L29'>next</a>, <span class="Constant">0/nil</span> +<span id="L249" class="LineNr">249 </span> curr <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L138'>set-rest</a> curr, next-curr +<span id="L250" class="LineNr">250 </span> curr <span class="Special"><-</span> rest curr <span id="L251" class="LineNr">251 </span> <span class="Delimiter">}</span> <span id="L252" class="LineNr">252 </span> <span class="Delimiter">{</span> <span id="L253" class="LineNr">253 </span> <span class="muControl">break-unless</span> is-dot? <span id="L254" class="LineNr">254 </span> <span class="Comment"># deal with dotted pair</span> -<span id="L255" class="LineNr">255 </span> in <span class="Special"><-</span> skip-whitespace in +<span id="L255" class="LineNr">255 </span> in <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L274'>skip-whitespace</a> in <span id="L256" class="LineNr">256 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L257" class="LineNr">257 </span> not-close-paren?:bool <span class="Special"><-</span> not-equal c, <span class="Constant">41/close-paren</span> <span id="L258" class="LineNr">258 </span> assert not-close-paren?, <span class="Constant">[')' cannot immediately follow '.']</span> -<span id="L259" class="LineNr">259 </span> final:&:cell <span class="Special"><-</span> parse in -<span id="L260" class="LineNr">260 </span> curr <span class="Special"><-</span> set-rest curr, final +<span id="L259" class="LineNr">259 </span> final:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse in +<span id="L260" class="LineNr">260 </span> curr <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L138'>set-rest</a> curr, final <span id="L261" class="LineNr">261 </span> <span class="Comment"># we're not gonna update curr, so better make sure the next iteration</span> <span id="L262" class="LineNr">262 </span> <span class="Comment"># is going to end the pair</span> -<span id="L263" class="LineNr">263 </span> in <span class="Special"><-</span> skip-whitespace in +<span id="L263" class="LineNr">263 </span> in <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L274'>skip-whitespace</a> in <span id="L264" class="LineNr">264 </span> c <span class="Special"><-</span> <a href='066stream.mu.html#L39'>peek</a> in <span id="L265" class="LineNr">265 </span> close-paren?:bool <span class="Special"><-</span> equal c, <span class="Constant">41/close-paren</span> <span id="L266" class="LineNr">266 </span> assert close-paren?, <span class="Constant">['.' must be followed by exactly one expression before ')']</span> @@ -333,7 +333,7 @@ if ('onhashchange' in window) { <span id="L271" class="LineNr">271 </span> <span class="Delimiter">}</span> <span id="L272" class="LineNr">272 </span>] <span id="L273" class="LineNr">273 </span> -<span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> skip-whitespace in:&:stream:char<span class="muRecipe"> -> </span>in:&:stream:char [ +<span id="L274" class="LineNr">274 </span><span class="muRecipe">def</span> <a href='lambda-to-mu.mu.html#L274'>skip-whitespace</a> in:&:stream:char<span class="muRecipe"> -> </span>in:&:stream:char [ <span id="L275" class="LineNr">275 </span> <span class="Constant">local-scope</span> <span id="L276" class="LineNr">276 </span> <span class="Constant">load-ingredients</span> <span id="L277" class="LineNr">277 </span> <span class="Delimiter">{</span> @@ -347,15 +347,15 @@ if ('onhashchange' in window) { <span id="L285" class="LineNr">285 </span> <span class="Delimiter">}</span> <span id="L286" class="LineNr">286 </span>] <span id="L287" class="LineNr">287 </span> -<span id="L288" class="LineNr">288 </span><span class="muRecipe">def</span> to-text x:&:cell<span class="muRecipe"> -> </span>out:text [ +<span id="L288" class="LineNr">288 </span><span class="muRecipe">def</span> to-text x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>out:text [ <span id="L289" class="LineNr">289 </span> <span class="Constant">local-scope</span> <span id="L290" class="LineNr">290 </span> <span class="Constant">load-ingredients</span> <span id="L291" class="LineNr">291 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> -<span id="L292" class="LineNr">292 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> x, buf +<span id="L292" class="LineNr">292 </span> buf <span class="Special"><-</span> to-buffer x, buf <span id="L293" class="LineNr">293 </span> out <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L294" class="LineNr">294 </span>] <span id="L295" class="LineNr">295 </span> -<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> <a href='064list.mu.html#L307'>to-buffer</a> x:&:cell, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ +<span id="L296" class="LineNr">296 </span><span class="muRecipe">def</span> to-buffer x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a> [ <span id="L297" class="LineNr">297 </span> <span class="Constant">local-scope</span> <span id="L298" class="LineNr">298 </span> <span class="Constant">load-ingredients</span> <span id="L299" class="LineNr">299 </span> <span class="Comment"># base case: empty cell</span> @@ -373,18 +373,18 @@ if ('onhashchange' in window) { <span id="L311" class="LineNr">311 </span> <span class="Delimiter">}</span> <span id="L312" class="LineNr">312 </span> <span class="Comment"># recursive case: pair</span> <span id="L313" class="LineNr">313 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[< ]</span> -<span id="L314" class="LineNr">314 </span> first:&:cell <span class="Special"><-</span> first x -<span id="L315" class="LineNr">315 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> first, buf +<span id="L314" class="LineNr">314 </span> first:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L315" class="LineNr">315 </span> buf <span class="Special"><-</span> to-buffer first, buf <span id="L316" class="LineNr">316 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[ | ]</span> -<span id="L317" class="LineNr">317 </span> <a href='064list.mu.html#L25'>rest</a>:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x -<span id="L318" class="LineNr">318 </span> buf <span class="Special"><-</span> <a href='064list.mu.html#L307'>to-buffer</a> <a href='064list.mu.html#L25'>rest</a>, buf +<span id="L317" class="LineNr">317 </span> rest:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x +<span id="L318" class="LineNr">318 </span> buf <span class="Special"><-</span> to-buffer rest, buf <span id="L319" class="LineNr">319 </span> buf <span class="Special"><-</span> append buf, <span class="Constant">[ >]</span> <span id="L320" class="LineNr">320 </span>] <span id="L321" class="LineNr">321 </span> <span id="L322" class="LineNr">322 </span><span class="muScenario">scenario</span> parse-single-letter-atom [ <span id="L323" class="LineNr">323 </span> <span class="Constant">local-scope</span> <span id="L324" class="LineNr">324 </span> s:text <span class="Special"><-</span> new <span class="Constant">[a]</span> -<span id="L325" class="LineNr">325 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L325" class="LineNr">325 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L326" class="LineNr">326 </span> s2:text, 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x, <span class="Constant">atom:variant</span> <span id="L327" class="LineNr">327 </span> 11:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L328" class="LineNr">328 </span> memory-should-contain [ @@ -396,7 +396,7 @@ if ('onhashchange' in window) { <span id="L334" class="LineNr">334 </span><span class="muScenario">scenario</span> parse-atom [ <span id="L335" class="LineNr">335 </span> <span class="Constant">local-scope</span> <span id="L336" class="LineNr">336 </span> s:text <span class="Special"><-</span> new <span class="Constant">[abc]</span> -<span id="L337" class="LineNr">337 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L337" class="LineNr">337 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L338" class="LineNr">338 </span> s2:text, 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x, <span class="Constant">atom:variant</span> <span id="L339" class="LineNr">339 </span> 11:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L340" class="LineNr">340 </span> memory-should-contain [ @@ -408,18 +408,18 @@ if ('onhashchange' in window) { <span id="L346" class="LineNr">346 </span><span class="muScenario">scenario</span> parse-list-of-two-atoms [ <span id="L347" class="LineNr">347 </span> <span class="Constant">local-scope</span> <span id="L348" class="LineNr">348 </span> s:text <span class="Special"><-</span> new <span class="Constant">[(abc def)]</span> -<span id="L349" class="LineNr">349 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L349" class="LineNr">349 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L350" class="LineNr">350 </span> trace-should-contain [ <span id="L351" class="LineNr">351 </span> app/parse: <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><</span> def <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">></span> <span id="L352" class="LineNr">352 </span> ] -<span id="L353" class="LineNr">353 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L354" class="LineNr">354 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L355" class="LineNr">355 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L353" class="LineNr">353 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L354" class="LineNr">354 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L355" class="LineNr">355 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x <span id="L356" class="LineNr">356 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> -<span id="L357" class="LineNr">357 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 -<span id="L358" class="LineNr">358 </span> x3:&:cell <span class="Special"><-</span> first x2 +<span id="L357" class="LineNr">357 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x2 +<span id="L358" class="LineNr">358 </span> x3:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x2 <span id="L359" class="LineNr">359 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L360" class="LineNr">360 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 +<span id="L360" class="LineNr">360 </span> 14:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x2 <span id="L361" class="LineNr">361 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L362" class="LineNr">362 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L363" class="LineNr">363 </span> memory-should-contain [ @@ -436,18 +436,18 @@ if ('onhashchange' in window) { <span id="L374" class="LineNr">374 </span><span class="muScenario">scenario</span> parse-list-with-extra-spaces [ <span id="L375" class="LineNr">375 </span> <span class="Constant">local-scope</span> <span id="L376" class="LineNr">376 </span> s:text <span class="Special"><-</span> new <span class="Constant">[ ( abc def ) ]</span> <span class="Comment"># extra spaces</span> -<span id="L377" class="LineNr">377 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L377" class="LineNr">377 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L378" class="LineNr">378 </span> trace-should-contain [ <span id="L379" class="LineNr">379 </span> app/parse: <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><</span> def <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">></span> <span id="L380" class="LineNr">380 </span> ] -<span id="L381" class="LineNr">381 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L382" class="LineNr">382 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L383" class="LineNr">383 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L381" class="LineNr">381 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L382" class="LineNr">382 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L383" class="LineNr">383 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x <span id="L384" class="LineNr">384 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> -<span id="L385" class="LineNr">385 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 -<span id="L386" class="LineNr">386 </span> x3:&:cell <span class="Special"><-</span> first x2 +<span id="L385" class="LineNr">385 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x2 +<span id="L386" class="LineNr">386 </span> x3:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x2 <span id="L387" class="LineNr">387 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L388" class="LineNr">388 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 +<span id="L388" class="LineNr">388 </span> 14:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x2 <span id="L389" class="LineNr">389 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L390" class="LineNr">390 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L391" class="LineNr">391 </span> memory-should-contain [ @@ -464,22 +464,22 @@ if ('onhashchange' in window) { <span id="L402" class="LineNr">402 </span><span class="muScenario">scenario</span> parse-list-of-more-than-two-atoms [ <span id="L403" class="LineNr">403 </span> <span class="Constant">local-scope</span> <span id="L404" class="LineNr">404 </span> s:text <span class="Special"><-</span> new <span class="Constant">[(abc def ghi)]</span> -<span id="L405" class="LineNr">405 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L405" class="LineNr">405 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L406" class="LineNr">406 </span> trace-should-contain [ <span id="L407" class="LineNr">407 </span> app/parse: <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><</span> def <span class="Constant">|</span> <span class="Constant"><</span> ghi <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">></span> <span class="Constant">></span> <span id="L408" class="LineNr">408 </span> ] -<span id="L409" class="LineNr">409 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L410" class="LineNr">410 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L411" class="LineNr">411 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L409" class="LineNr">409 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L410" class="LineNr">410 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L411" class="LineNr">411 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x <span id="L412" class="LineNr">412 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> -<span id="L413" class="LineNr">413 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 -<span id="L414" class="LineNr">414 </span> x3:&:cell <span class="Special"><-</span> first x2 +<span id="L413" class="LineNr">413 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x2 +<span id="L414" class="LineNr">414 </span> x3:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x2 <span id="L415" class="LineNr">415 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L416" class="LineNr">416 </span> x4:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 -<span id="L417" class="LineNr">417 </span> 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x4 -<span id="L418" class="LineNr">418 </span> x5:&:cell <span class="Special"><-</span> first x4 +<span id="L416" class="LineNr">416 </span> x4:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x2 +<span id="L417" class="LineNr">417 </span> 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x4 +<span id="L418" class="LineNr">418 </span> x5:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x4 <span id="L419" class="LineNr">419 </span> s3:text, 15:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x5, <span class="Constant">atom:variant</span> -<span id="L420" class="LineNr">420 </span> 16:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x4 +<span id="L420" class="LineNr">420 </span> 16:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x4 <span id="L421" class="LineNr">421 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L422" class="LineNr">422 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L423" class="LineNr">423 </span> 40:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s3 @@ -500,17 +500,17 @@ if ('onhashchange' in window) { <span id="L438" class="LineNr">438 </span><span class="muScenario">scenario</span> parse-nested-list [ <span id="L439" class="LineNr">439 </span> <span class="Constant">local-scope</span> <span id="L440" class="LineNr">440 </span> s:text <span class="Special"><-</span> new <span class="Constant">[((abc))]</span> -<span id="L441" class="LineNr">441 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L441" class="LineNr">441 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L442" class="LineNr">442 </span> trace-should-contain [ <span id="L443" class="LineNr">443 </span> app/parse: <span class="Constant"><</span> <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span id="L444" class="LineNr">444 </span> ] -<span id="L445" class="LineNr">445 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L446" class="LineNr">446 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L447" class="LineNr">447 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L448" class="LineNr">448 </span> x2:&:cell <span class="Special"><-</span> first x1 +<span id="L445" class="LineNr">445 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L446" class="LineNr">446 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L447" class="LineNr">447 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L448" class="LineNr">448 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x1 <span id="L449" class="LineNr">449 </span> s1:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> -<span id="L450" class="LineNr">450 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x1 -<span id="L451" class="LineNr">451 </span> 14:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L450" class="LineNr">450 </span> 13:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x1 +<span id="L451" class="LineNr">451 </span> 14:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x <span id="L452" class="LineNr">452 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L453" class="LineNr">453 </span> memory-should-contain [ <span id="L454" class="LineNr">454 </span> <span class="Constant"> 10</span> <span class="Special"><-</span><span class="Constant"> 1</span> <span class="Comment"># parse result is a pair</span> @@ -525,20 +525,20 @@ if ('onhashchange' in window) { <span id="L463" class="LineNr">463 </span><span class="muScenario">scenario</span> parse-nested-list-2 [ <span id="L464" class="LineNr">464 </span> <span class="Constant">local-scope</span> <span id="L465" class="LineNr">465 </span> s:text <span class="Special"><-</span> new <span class="Constant">[((abc) def)]</span> -<span id="L466" class="LineNr">466 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L466" class="LineNr">466 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L467" class="LineNr">467 </span> trace-should-contain [ <span id="L468" class="LineNr">468 </span> app/parse: <span class="Constant"><</span> <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">|</span> <span class="Constant"><</span> def <span class="Constant">|</span> <span class="Constant"><></span> <span class="Constant">></span> <span class="Constant">></span> <span id="L469" class="LineNr">469 </span> ] -<span id="L470" class="LineNr">470 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L471" class="LineNr">471 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L472" class="LineNr">472 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L473" class="LineNr">473 </span> x2:&:cell <span class="Special"><-</span> first x1 +<span id="L470" class="LineNr">470 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L471" class="LineNr">471 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L472" class="LineNr">472 </span> 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L473" class="LineNr">473 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x1 <span id="L474" class="LineNr">474 </span> s1:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> -<span id="L475" class="LineNr">475 </span> 13:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x1 -<span id="L476" class="LineNr">476 </span> x3:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x -<span id="L477" class="LineNr">477 </span> x4:&:cell <span class="Special"><-</span> first x3 +<span id="L475" class="LineNr">475 </span> 13:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x1 +<span id="L476" class="LineNr">476 </span> x3:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x +<span id="L477" class="LineNr">477 </span> x4:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x3 <span id="L478" class="LineNr">478 </span> s2:text, 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x4, <span class="Constant">atom:variant</span> -<span id="L479" class="LineNr">479 </span> 15:&:cell/<span class="Special">raw</span> <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x3 +<span id="L479" class="LineNr">479 </span> 15:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>/<span class="Special">raw</span> <span class="Special"><-</span> rest x3 <span id="L480" class="LineNr">480 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L481" class="LineNr">481 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 <span id="L482" class="LineNr">482 </span> memory-should-contain [ @@ -580,13 +580,13 @@ if ('onhashchange' in window) { <span id="L518" class="LineNr">518 </span><span class="muScenario">scenario</span> parse-dotted-list-of-two-atoms [ <span id="L519" class="LineNr">519 </span> <span class="Constant">local-scope</span> <span id="L520" class="LineNr">520 </span> s:text <span class="Special"><-</span> new <span class="Constant">[(abc . def)]</span> -<span id="L521" class="LineNr">521 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L521" class="LineNr">521 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L522" class="LineNr">522 </span> trace-should-contain [ <span id="L523" class="LineNr">523 </span> app/parse: <span class="Constant"><</span> abc <span class="Constant">|</span> def <span class="Constant">></span> <span id="L524" class="LineNr">524 </span> ] -<span id="L525" class="LineNr">525 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L526" class="LineNr">526 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L527" class="LineNr">527 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L525" class="LineNr">525 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L526" class="LineNr">526 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L527" class="LineNr">527 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x <span id="L528" class="LineNr">528 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> <span id="L529" class="LineNr">529 </span> s2:text, 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x2, <span class="Constant">atom:variant</span> <span id="L530" class="LineNr">530 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 @@ -604,18 +604,18 @@ if ('onhashchange' in window) { <span id="L542" class="LineNr">542 </span><span class="muScenario">scenario</span> parse-dotted-list-of-more-than-two-atoms [ <span id="L543" class="LineNr">543 </span> <span class="Constant">local-scope</span> <span id="L544" class="LineNr">544 </span> s:text <span class="Special"><-</span> new <span class="Constant">[(abc def . ghi)]</span> -<span id="L545" class="LineNr">545 </span> x:&:cell <span class="Special"><-</span> parse s +<span id="L545" class="LineNr">545 </span> x:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> parse s <span id="L546" class="LineNr">546 </span> trace-should-contain [ <span id="L547" class="LineNr">547 </span> app/parse: <span class="Constant"><</span> abc <span class="Constant">|</span> <span class="Constant"><</span> def <span class="Constant">|</span> ghi <span class="Constant">></span> <span class="Constant">></span> <span id="L548" class="LineNr">548 </span> ] -<span id="L549" class="LineNr">549 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x -<span id="L550" class="LineNr">550 </span> x1:&:cell <span class="Special"><-</span> first x -<span id="L551" class="LineNr">551 </span> x2:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x +<span id="L549" class="LineNr">549 </span> 10:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x +<span id="L550" class="LineNr">550 </span> x1:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x +<span id="L551" class="LineNr">551 </span> x2:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x <span id="L552" class="LineNr">552 </span> s1:text, 11:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x1, <span class="Constant">atom:variant</span> -<span id="L553" class="LineNr">553 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> is-pair? x2 -<span id="L554" class="LineNr">554 </span> x3:&:cell <span class="Special"><-</span> first x2 +<span id="L553" class="LineNr">553 </span> 12:bool/<span class="Special">raw</span> <span class="Special"><-</span> <a href='lambda-to-mu.mu.html#L63'>is-pair?</a> x2 +<span id="L554" class="LineNr">554 </span> x3:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> first x2 <span id="L555" class="LineNr">555 </span> s2:text, 13:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x3, <span class="Constant">atom:variant</span> -<span id="L556" class="LineNr">556 </span> x4:&:cell <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> x2 +<span id="L556" class="LineNr">556 </span> x4:&:<a href='lambda-to-mu.mu.html#L31'>cell</a> <span class="Special"><-</span> rest x2 <span id="L557" class="LineNr">557 </span> s3:text, 14:bool/<span class="Special">raw</span> <span class="Special"><-</span> maybe-convert *x4, <span class="Constant">atom:variant</span> <span id="L558" class="LineNr">558 </span> 20:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s1 <span id="L559" class="LineNr">559 </span> 30:@:char/<span class="Special">raw</span> <span class="Special"><-</span> copy *s2 @@ -634,7 +634,7 @@ if ('onhashchange' in window) { <span id="L572" class="LineNr">572 </span> <span id="L573" class="LineNr">573 </span><span class="SalientComment">## convert tree of cells to Mu text</span> <span id="L574" class="LineNr">574 </span> -<span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> to-mu in:&:cell<span class="muRecipe"> -> </span>out:text [ +<span id="L575" class="LineNr">575 </span><span class="muRecipe">def</span> to-mu in:&:<a href='lambda-to-mu.mu.html#L31'>cell</a><span class="muRecipe"> -> </span>out:text [ <span id="L576" class="LineNr">576 </span> <span class="Constant">local-scope</span> <span id="L577" class="LineNr">577 </span> <span class="Constant">load-ingredients</span> <span id="L578" class="LineNr">578 </span> buf:&:<a href='061text.mu.html#L127'>buffer</a> <span class="Special"><-</span> <a href='061text.mu.html#L132'>new-buffer</a><span class="Constant"> 30</span> @@ -642,7 +642,7 @@ if ('onhashchange' in window) { <span id="L580" class="LineNr">580 </span> out <span class="Special"><-</span> <a href='061text.mu.html#L329'>buffer-to-array</a> buf <span id="L581" class="LineNr">581 </span>] <span id="L582" class="LineNr">582 </span> -<span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> to-mu in:&:cell, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a>, result-name:text [ +<span id="L583" class="LineNr">583 </span><span class="muRecipe">def</span> to-mu in:&:<a href='lambda-to-mu.mu.html#L31'>cell</a>, buf:&:<a href='061text.mu.html#L127'>buffer</a><span class="muRecipe"> -> </span>buf:&:<a href='061text.mu.html#L127'>buffer</a>, result-name:text [ <span id="L584" class="LineNr">584 </span> <span class="Constant">local-scope</span> <span id="L585" class="LineNr">585 </span> <span class="Constant">load-ingredients</span> <span id="L586" class="LineNr">586 </span> <span class="Comment"># null cell? no change.</span> diff --git a/html/mutable.mu.html b/html/mutable.mu.html index d608970e..7669224d 100644 --- a/html/mutable.mu.html +++ b/html/mutable.mu.html @@ -56,13 +56,13 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr"> 1 </span><span class="Comment"># compare immutable-error.mu</span> <span id="L2" class="LineNr"> 2 </span> -<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr"> 3 </span><span class="muRecipe">def</span> <a href='mutable.mu.html#L3'>main</a> [ <span id="L4" class="LineNr"> 4 </span> <span class="Constant">local-scope</span> <span id="L5" class="LineNr"> 5 </span> x:&:num <span class="Special"><-</span> new <span class="Constant">number:type</span> -<span id="L6" class="LineNr"> 6 </span> foo x +<span id="L6" class="LineNr"> 6 </span> <a href='mutable.mu.html#L9'>foo</a> x <span id="L7" class="LineNr"> 7 </span>] <span id="L8" class="LineNr"> 8 </span> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> foo x:&:num<span class="muRecipe"> -> </span>x:&:num [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='mutable.mu.html#L9'>foo</a> x:&:num<span class="muRecipe"> -> </span>x:&:num [ <span id="L10" class="LineNr">10 </span> <span class="Constant">local-scope</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">load-ingredients</span> <span id="L12" class="LineNr">12 </span> *x <span class="Special"><-</span> copy<span class="Constant"> 34</span> diff --git a/html/nqueens.mu.html b/html/nqueens.mu.html index e0c4da82..6035fb3d 100644 --- a/html/nqueens.mu.html +++ b/html/nqueens.mu.html @@ -62,12 +62,12 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Comment"># run with tracing turned on:</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment"># ./mu --trace nqueens.mu</span> <span id="L5" class="LineNr"> 5 </span> -<span id="L6" class="LineNr"> 6 </span><span class="muData">container</span> square [ +<span id="L6" class="LineNr"> 6 </span><span class="muData">container</span> <a href='nqueens.mu.html#L6'>square</a> [ <span id="L7" class="LineNr"> 7 </span> rank:num <span id="L8" class="LineNr"> 8 </span> file:num <span id="L9" class="LineNr"> 9 </span>] <span id="L10" class="LineNr">10 </span> -<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> nqueens n:num, queens:&:list:square<span class="muRecipe"> -> </span>result:num, queens:&:list:square [ +<span id="L11" class="LineNr">11 </span><span class="muRecipe">def</span> <a href='nqueens.mu.html#L11'>nqueens</a> n:num, queens:&:list:<a href='nqueens.mu.html#L6'>square</a><span class="muRecipe"> -> </span>result:num, queens:&:list:<a href='nqueens.mu.html#L6'>square</a> [ <span id="L12" class="LineNr">12 </span> <span class="Constant">local-scope</span> <span id="L13" class="LineNr">13 </span> <span class="Constant">load-ingredients</span> <span id="L14" class="LineNr">14 </span> <span class="Comment"># if 'queens' is already long enough, print it and return</span> @@ -82,7 +82,7 @@ if ('onhashchange' in window) { <span id="L23" class="LineNr">23 </span> next-rank:num <span class="Special"><-</span> copy<span class="Constant"> 0</span> <span id="L24" class="LineNr">24 </span> <span class="Delimiter">{</span> <span id="L25" class="LineNr">25 </span> <span class="muControl">break-unless</span> queens -<span id="L26" class="LineNr">26 </span> first:square <span class="Special"><-</span> first queens +<span id="L26" class="LineNr">26 </span> first:<a href='nqueens.mu.html#L6'>square</a> <span class="Special"><-</span> first queens <span id="L27" class="LineNr">27 </span> existing-rank:num <span class="Special"><-</span> get first, <span class="Constant">rank:offset</span> <span id="L28" class="LineNr">28 </span> next-rank <span class="Special"><-</span> add existing-rank,<span class="Constant"> 1</span> <span id="L29" class="LineNr">29 </span> <span class="Delimiter">}</span> @@ -91,12 +91,12 @@ if ('onhashchange' in window) { <span id="L32" class="LineNr">32 </span> <span class="Delimiter">{</span> <span id="L33" class="LineNr">33 </span> done?:bool <span class="Special"><-</span> greater-or-equal next-file, n <span id="L34" class="LineNr">34 </span> <span class="muControl">break-if</span> done? -<span id="L35" class="LineNr">35 </span> curr:square <span class="Special"><-</span> merge next-rank, next-file +<span id="L35" class="LineNr">35 </span> curr:<a href='nqueens.mu.html#L6'>square</a> <span class="Special"><-</span> merge next-rank, next-file <span id="L36" class="LineNr">36 </span> <span class="Delimiter">{</span> -<span id="L37" class="LineNr">37 </span> curr-conflicts?:bool <span class="Special"><-</span> conflict? curr, queens +<span id="L37" class="LineNr">37 </span> curr-conflicts?:bool <span class="Special"><-</span> <a href='nqueens.mu.html#L49'>conflict?</a> curr, queens <span id="L38" class="LineNr">38 </span> <span class="muControl">break-if</span> curr-conflicts? -<span id="L39" class="LineNr">39 </span> queens:&:list:square <span class="Special"><-</span> push curr, queens -<span id="L40" class="LineNr">40 </span> sub-result:num <span class="Special"><-</span> nqueens n, queens +<span id="L39" class="LineNr">39 </span> queens:&:list:<a href='nqueens.mu.html#L6'>square</a> <span class="Special"><-</span> push curr, queens +<span id="L40" class="LineNr">40 </span> sub-result:num <span class="Special"><-</span> <a href='nqueens.mu.html#L11'>nqueens</a> n, queens <span id="L41" class="LineNr">41 </span> result <span class="Special"><-</span> add result, sub-result <span id="L42" class="LineNr">42 </span> queens <span class="Special"><-</span> <a href='064list.mu.html#L25'>rest</a> queens <span id="L43" class="LineNr">43 </span> <span class="Delimiter">}</span> @@ -105,22 +105,22 @@ if ('onhashchange' in window) { <span id="L46" class="LineNr">46 </span> <span class="Delimiter">}</span> <span id="L47" class="LineNr">47 </span>] <span id="L48" class="LineNr">48 </span> -<span id="L49" class="LineNr">49 </span><span class="muRecipe">def</span> conflict? curr:square, queens:&:list:square<span class="muRecipe"> -> </span>result:bool [ +<span id="L49" class="LineNr">49 </span><span class="muRecipe">def</span> <a href='nqueens.mu.html#L49'>conflict?</a> curr:<a href='nqueens.mu.html#L6'>square</a>, queens:&:list:<a href='nqueens.mu.html#L6'>square</a><span class="muRecipe"> -> </span>result:bool [ <span id="L50" class="LineNr">50 </span> <span class="Constant">local-scope</span> <span id="L51" class="LineNr">51 </span> <span class="Constant">load-ingredients</span> -<span id="L52" class="LineNr">52 </span> result1:bool <span class="Special"><-</span> conflicting-file? curr, queens +<span id="L52" class="LineNr">52 </span> result1:bool <span class="Special"><-</span> <a href='nqueens.mu.html#L58'>conflicting-file?</a> curr, queens <span id="L53" class="LineNr">53 </span> <span class="muControl">return-if</span> result1, result1 -<span id="L54" class="LineNr">54 </span> result2:bool <span class="Special"><-</span> conflicting-diagonal? curr, queens +<span id="L54" class="LineNr">54 </span> result2:bool <span class="Special"><-</span> <a href='nqueens.mu.html#L74'>conflicting-diagonal?</a> curr, queens <span id="L55" class="LineNr">55 </span> <span class="muControl">return</span> result2 <span id="L56" class="LineNr">56 </span>] <span id="L57" class="LineNr">57 </span> -<span id="L58" class="LineNr">58 </span><span class="muRecipe">def</span> conflicting-file? curr:square, queens:&:list:square<span class="muRecipe"> -> </span>result:bool [ +<span id="L58" class="LineNr">58 </span><span class="muRecipe">def</span> <a href='nqueens.mu.html#L58'>conflicting-file?</a> curr:<a href='nqueens.mu.html#L6'>square</a>, queens:&:list:<a href='nqueens.mu.html#L6'>square</a><span class="muRecipe"> -> </span>result:bool [ <span id="L59" class="LineNr">59 </span> <span class="Constant">local-scope</span> <span id="L60" class="LineNr">60 </span> <span class="Constant">load-ingredients</span> <span id="L61" class="LineNr">61 </span> curr-file:num <span class="Special"><-</span> get curr, <span class="Constant">file:offset</span> <span id="L62" class="LineNr">62 </span> <span class="Delimiter">{</span> <span id="L63" class="LineNr">63 </span> <span class="muControl">break-unless</span> queens -<span id="L64" class="LineNr">64 </span> q:square <span class="Special"><-</span> first queens +<span id="L64" class="LineNr">64 </span> q:<a href='nqueens.mu.html#L6'>square</a> <span class="Special"><-</span> first queens <span id="L65" class="LineNr">65 </span> qfile:num <span class="Special"><-</span> get q, <span class="Constant">file:offset</span> <span id="L66" class="LineNr">66 </span> file-match?:bool <span class="Special"><-</span> equal curr-file, qfile <span id="L67" class="LineNr">67 </span> <span class="muControl">return-if</span> file-match?, <span class="Constant">1/conflict-found</span> @@ -130,14 +130,14 @@ if ('onhashchange' in window) { <span id="L71" class="LineNr">71 </span> <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span> <span id="L72" class="LineNr">72 </span>] <span id="L73" class="LineNr">73 </span> -<span id="L74" class="LineNr">74 </span><span class="muRecipe">def</span> conflicting-diagonal? curr:square, queens:&:list:square<span class="muRecipe"> -> </span>result:bool [ +<span id="L74" class="LineNr">74 </span><span class="muRecipe">def</span> <a href='nqueens.mu.html#L74'>conflicting-diagonal?</a> curr:<a href='nqueens.mu.html#L6'>square</a>, queens:&:list:<a href='nqueens.mu.html#L6'>square</a><span class="muRecipe"> -> </span>result:bool [ <span id="L75" class="LineNr">75 </span> <span class="Constant">local-scope</span> <span id="L76" class="LineNr">76 </span> <span class="Constant">load-ingredients</span> <span id="L77" class="LineNr">77 </span> curr-rank:num <span class="Special"><-</span> get curr, <span class="Constant">rank:offset</span> <span id="L78" class="LineNr">78 </span> curr-file:num <span class="Special"><-</span> get curr, <span class="Constant">file:offset</span> <span id="L79" class="LineNr">79 </span> <span class="Delimiter">{</span> <span id="L80" class="LineNr">80 </span> <span class="muControl">break-unless</span> queens -<span id="L81" class="LineNr">81 </span> q:square <span class="Special"><-</span> first queens +<span id="L81" class="LineNr">81 </span> q:<a href='nqueens.mu.html#L6'>square</a> <span class="Special"><-</span> first queens <span id="L82" class="LineNr">82 </span> qrank:num <span class="Special"><-</span> get q, <span class="Constant">rank:offset</span> <span id="L83" class="LineNr">83 </span> qfile:num <span class="Special"><-</span> get q, <span class="Constant">file:offset</span> <span id="L84" class="LineNr">84 </span> rank-delta:num <span class="Special"><-</span> subtract qrank, curr-rank @@ -152,8 +152,8 @@ if ('onhashchange' in window) { <span id="L93" class="LineNr">93 </span> <span class="muControl">return</span> <span class="Constant">0/no-conflict-found</span> <span id="L94" class="LineNr">94 </span>] <span id="L95" class="LineNr">95 </span> -<span id="L96" class="LineNr">96 </span><span class="muRecipe">def</span> main [ -<span id="L97" class="LineNr">97 </span> nqueens<span class="Constant"> 4</span> +<span id="L96" class="LineNr">96 </span><span class="muRecipe">def</span> <a href='nqueens.mu.html#L96'>main</a> [ +<span id="L97" class="LineNr">97 </span> <a href='nqueens.mu.html#L11'>nqueens</a><span class="Constant"> 4</span> <span id="L98" class="LineNr">98 </span> $dump-trace <span class="Constant">[app]</span> <span id="L99" class="LineNr">99 </span>] </pre> diff --git a/html/real-files.mu.html b/html/real-files.mu.html index fe3f0ce3..f3edc213 100644 --- a/html/real-files.mu.html +++ b/html/real-files.mu.html @@ -59,7 +59,7 @@ if ('onhashchange' in window) { <span id="L3" class="LineNr"> 3 </span><span class="Comment"># before running it, put a character into /tmp/mu-x</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment"># after running it, check /tmp/mu-y</span> <span id="L5" class="LineNr"> 5 </span> -<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> main [ +<span id="L6" class="LineNr"> 6 </span><span class="muRecipe">def</span> <a href='real-files.mu.html#L6'>main</a> [ <span id="L7" class="LineNr"> 7 </span> <span class="Constant">local-scope</span> <span id="L8" class="LineNr"> 8 </span> f:num/file <span class="Special"><-</span> $open-file-for-reading <span class="Constant">[/tmp/mu-x]</span> <span id="L9" class="LineNr"> 9 </span> $print <span class="Constant">[file to read from: ]</span>, f, <span class="Constant">10/newline</span> diff --git a/html/screen.mu.html b/html/screen.mu.html index 4b485314..ec6d0a4d 100644 --- a/html/screen.mu.html +++ b/html/screen.mu.html @@ -58,7 +58,7 @@ if ('onhashchange' in window) { <span id="L2" class="LineNr"> 2 </span> <span id="L3" class="LineNr"> 3 </span><span class="Comment"># The zero screen below means 'use the real screen'. Tests can also use fake</span> <span id="L4" class="LineNr"> 4 </span><span class="Comment"># screens.</span> -<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> main [ +<span id="L5" class="LineNr"> 5 </span><span class="muRecipe">def</span> <a href='screen.mu.html#L5'>main</a> [ <span id="L6" class="LineNr"> 6 </span> open-console <span id="L7" class="LineNr"> 7 </span> 10:char <span class="Special"><-</span> copy <span class="Constant">97/a</span> <span id="L8" class="LineNr"> 8 </span> print <span class="Constant">0/screen</span>, 10:char/a, <span class="Constant">2/red</span> diff --git a/html/static-dispatch.mu.html b/html/static-dispatch.mu.html index 58512b91..4012290d 100644 --- a/html/static-dispatch.mu.html +++ b/html/static-dispatch.mu.html @@ -66,7 +66,7 @@ if ('onhashchange' in window) { <span id="L10" class="LineNr">10 </span> c <span class="Special"><-</span> add a, b <span id="L11" class="LineNr">11 </span>] <span id="L12" class="LineNr">12 </span> -<span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> main [ +<span id="L13" class="LineNr">13 </span><span class="muRecipe">def</span> <a href='static-dispatch.mu.html#L13'>main</a> [ <span id="L14" class="LineNr">14 </span> <span class="Constant">local-scope</span> <span id="L15" class="LineNr">15 </span> a:num <span class="Special"><-</span> test<span class="Constant"> 3</span> <span class="Comment"># selects single-ingredient version</span> <span id="L16" class="LineNr">16 </span> $print a, <span class="Constant">10/newline</span> diff --git a/html/tangle.mu.html b/html/tangle.mu.html index 97fe9307..3a24545b 100644 --- a/html/tangle.mu.html +++ b/html/tangle.mu.html @@ -64,31 +64,31 @@ if ('onhashchange' in window) { <span id="L6" class="LineNr"> 6 </span><span class="Comment"># This isn't a very tasteful example, just a simple demonstration of</span> <span id="L7" class="LineNr"> 7 </span><span class="Comment"># possibilities.</span> <span id="L8" class="LineNr"> 8 </span> -<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> factorial n:num<span class="muRecipe"> -> </span>result:num [ +<span id="L9" class="LineNr"> 9 </span><span class="muRecipe">def</span> <a href='tangle.mu.html#L9'>factorial</a> n:num<span class="muRecipe"> -> </span>result:num [ <span id="L10" class="LineNr">10 </span> <span class="Constant">local-scope</span> <span id="L11" class="LineNr">11 </span> <span class="Constant">load-ingredients</span> <span id="L12" class="LineNr">12 </span> <span class="Delimiter">{</span> -<span id="L13" class="LineNr">13 </span><span class="Constant"> <base-case></span> +<span id="L13" class="LineNr">13 </span><span class="Constant"> <a href='tangle.mu.html#L13'><base-case></a></span> <span id="L14" class="LineNr">14 </span> <span class="Delimiter">}</span> -<span id="L15" class="LineNr">15 </span><span class="Constant"> <recursive-case></span> +<span id="L15" class="LineNr">15 </span><span class="Constant"> <a href='tangle.mu.html#L15'><recursive-case></a></span> <span id="L16" class="LineNr">16 </span>] <span id="L17" class="LineNr">17 </span> -<span id="L18" class="LineNr">18 </span><span class="muRecipe">after</span> <span class="Constant"><base-case></span> [ +<span id="L18" class="LineNr">18 </span><span class="muRecipe">after</span> <span class="Constant"><a href='tangle.mu.html#L13'><base-case></a></span> [ <span id="L19" class="LineNr">19 </span> <span class="Comment"># if n=0 return 1</span> <span id="L20" class="LineNr">20 </span> zero?:bool <span class="Special"><-</span> equal n,<span class="Constant"> 0</span> <span id="L21" class="LineNr">21 </span> <span class="muControl">break-unless</span> zero? <span id="L22" class="LineNr">22 </span> <span class="muControl">return</span><span class="Constant"> 1</span> <span id="L23" class="LineNr">23 </span>] <span id="L24" class="LineNr">24 </span> -<span id="L25" class="LineNr">25 </span><span class="muRecipe">after</span> <span class="Constant"><recursive-case></span> [ +<span id="L25" class="LineNr">25 </span><span class="muRecipe">after</span> <span class="Constant"><a href='tangle.mu.html#L15'><recursive-case></a></span> [ <span id="L26" class="LineNr">26 </span> <span class="Comment"># return n * factorial(n - 1)</span> <span id="L27" class="LineNr">27 </span> x:num <span class="Special"><-</span> subtract n,<span class="Constant"> 1</span> -<span id="L28" class="LineNr">28 </span> subresult:num <span class="Special"><-</span> factorial x +<span id="L28" class="LineNr">28 </span> subresult:num <span class="Special"><-</span> <a href='tangle.mu.html#L9'>factorial</a> x <span id="L29" class="LineNr">29 </span> result <span class="Special"><-</span> multiply subresult, n <span id="L30" class="LineNr">30 </span>] <span id="L31" class="LineNr">31 </span> -<span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> main [ -<span id="L33" class="LineNr">33 </span> 1:num <span class="Special"><-</span> factorial<span class="Constant"> 5</span> +<span id="L32" class="LineNr">32 </span><span class="muRecipe">def</span> <a href='tangle.mu.html#L32'>main</a> [ +<span id="L33" class="LineNr">33 </span> 1:num <span class="Special"><-</span> <a href='tangle.mu.html#L9'>factorial</a><span class="Constant"> 5</span> <span id="L34" class="LineNr">34 </span> <span class="Comment"># trailing space in next line is to help with syntax highlighting</span> <span id="L35" class="LineNr">35 </span> $print <span class="Constant">[result: ]</span>, 1:num, <span class="Constant">[ </span> <span id="L36" class="LineNr">36 </span><span class="Constant">]</span> diff --git a/html/x.mu.html b/html/x.mu.html index 66d39b59..a49fd366 100644 --- a/html/x.mu.html +++ b/html/x.mu.html @@ -56,7 +56,7 @@ if ('onhashchange' in window) { <pre id='vimCodeElement'> <span id="L1" class="LineNr">1 </span><span class="Comment"># example program: add two numbers</span> <span id="L2" class="LineNr">2 </span> -<span id="L3" class="LineNr">3 </span><span class="muRecipe">def</span> main [ +<span id="L3" class="LineNr">3 </span><span class="muRecipe">def</span> <a href='x.mu.html#L3'>main</a> [ <span id="L4" class="LineNr">4 </span> 11:num <span class="Special"><-</span> copy<span class="Constant"> 1</span> <span id="L5" class="LineNr">5 </span> 12:num <span class="Special"><-</span> copy<span class="Constant"> 3</span> <span id="L6" class="LineNr">6 </span> 13:num <span class="Special"><-</span> add 11:num, 12:num |